最近遇到的一些IT公司面試題,總結一下:
1. 12個大小形狀相同的球,其中一個質量與其他的不同,一個天平稱重三次,找出那個質量不同的球。
注意分析的順序。
2. 在一個字符串中查找另一個給定的字符串。
普通查找法,以及KMP算法。
3. 快速查找單鏈表的中間節點。
4. 找出數組中出現次數超過一半的數。
#include <stdio.h>
int find(int a[],int len)
{
if(NULL==a||len<=0)
{
return -1;
}
int temp=a[0];
int count =0;
int i;
for(i=0;i<len;i++){
if(count==0){
temp = a[i];
}
if(a[i]==temp){
count++;
}
else{
count--;
}
}
return temp;
}
int main(int args,char ** argv)
{
int a[] = {3,2,2,2,2,3};
int res = find(a,sizeof(a)/sizeof(int));
printf("%d\n",res);
return 0;
}
5. 找出數組中只出現一次的那個數,其他的數均出現兩次。
考慮位運算。
6. 一個無序數組中,數字兩兩不同,找出第K大的數。
7.判斷一個單鏈表是否有環以及環的連接點。
給定一個單鏈表,只給出頭指針head:
1)如何判斷是否存在環?
2)如何知道環的長度?
3)如何找出環的連接點在哪裏?
4)帶環鏈表的長度是多少?
解法:
1、對於問題1,使用追趕的方法,設定兩個指針slow、fast,從頭指針開始,每次分別前進1步、2步。如存在環,則兩者相遇;如不存在環,fast遇到NULL退出。
bool isExitsLoop(Node* head)
Node *slow = head, *fast = head;
//fast && fast->next保證了fast可以接着向下移動
while(fast && fast->next)
slow = slow->next
fast = fast->next->next;
if(slow == fast)
break;
return !(fast==NULL || fast->next == NULL);
2、對於問題2,記錄下問題1的碰撞點p,slow、fast從該點開始,再次碰撞所走過的操作數就是環的長度s。
3、問題3:有定理如下:碰撞點p到連接點的距離=頭指針到連接點的距離,因此,分別從碰撞點、頭指針開始走,相遇的那個點就是連接點。(證明略)
4、問題3中已經求出連接點距離頭指針的長度,加上問題2中求出的環的長度,二者之和就是帶環單鏈表的長度。
未完待續。。。。