面試題目小結

最近遇到的一些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中求出的環的長度,二者之和就是帶環單鏈表的長度。


未完待續。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章