常見算法題編程8道

常見算法題編程8道

1、在不借助第三個變量的情況下,把兩個int的變量XY的值互換,用任何自己熟悉的編程語言完成

參考答案:思路如下X=X+Y; Y=X-Y; X=X-Y; 具體編程語言完成情況由面試官檢查。

考察點:基本算法、語言基礎。

2、文件查找優化

背景:百度每天都有大量搜索,如果有一個大文本文件(保存各種詞語),每次搜索都必須要檢查查詢詞是否在這個大文件中,請問有什麼方式能夠提高查找效率

要求:先講解所使用的算法,然後用自己最熟悉的編程語言,在3分鐘內予以實現

參考答案:

基本方法:採用hash簽名,提高匹配效率;建立多叉樹保存文件數據,提高查找速度。如有列舉出更多簽名算法或更好數據結構形式,可加分

較優方法:在上面基礎上,將文本文件轉化為key->value的二進制文件,提高文件操作和查找速度

更優方法:在上面基礎上,開闢內存做cache,保存高頻率查詢詞,提高整體查找效率。如能完整給出cache的更新機制,加分;

考察點:基本數據結構;靈活採取算法處理實際問題的能力;快速編程能力;在給出一定提示情況下,檢查學習能力和知識應用能力。

4、有一份成績單,只有兩個字段:姓名、成績;數據量在百萬級別。要求用最優的數據存儲方式,能通過姓名快速查找出成績。(5分鐘)

參考答案:存儲方式採用對姓名做hash。

考察點:數據結構

5、找出單向鏈表的中間節點

參考答案:link* mid(link* head)

{

link* p1,*p2;

p1=p2=head;

if(head==NULL || head->next==NULL)

return head;

do {

p1=p1->next;

p2=p2->next->next;

} while(p2 && p2->next);

return p1;

}

考察點:算法基礎——鏈表

6、給定43億個32位整數的順序文件,請問如何可以找到一個至少出現兩次的整數?

考察:算法相關(10min)

參考答案:用二分查找發。

細節點:43億大於int的最大值,說明肯定有重複的數字

7、如何判斷一個單鏈表是有環的(不能用標誌位,最多隻能用兩個額外指針)(6分鐘)

考察點:算法及數據結構

參考答案:可以只給出算法思路,

一種O(n)的辦法就是(兩個指針,一個每次遞增一步,一個每次遞增兩步,如果有環的話兩者必然重合,反之亦然)

struct node { char val; node* next;}

bool check(const node* head) {} //return false : 無環;true: 有環

bool check(const node* head)

{

if(head==NULL) return false;

node *low=head, *fast=head->next;

while(fast!=NULL &&fast->next!=NULL)

{

low=low->next;

fast=fast->next->next;

if(low==fast) returntrue;

}

return false;

}

8、有一個一維數組int a[100],裡面存儲的是1100的這100個數,不過是亂序存儲;這時把其中某一位置的數值改成-1;請用最優的空間複雜性和時間複雜性求出該位置和值(6分鐘)

參考答案:

遍歷一遍數組得到-1的位置並記錄,同時把非-1的值相加得到sum

被改變的值為:50*(100-1)-sum

時間複雜性O(n),空間複雜性O(1)

考察點: 程序設計、邏輯思維能力

相關推薦

推薦中...