1、在不借助第三個變量的情況下,把兩個int的變量X、Y的值互換,用任何自己熟悉的編程語言完成
參考答案:思路如下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],裡面存儲的是1到100的這100個數,不過是亂序存儲;這時把其中某一位置的數值改成-1;請用最優的空間複雜性和時間複雜性求出該位置和值(6分鐘)
參考答案:
遍歷一遍數組得到-1的位置並記錄,同時把非-1的值相加得到sum
被改變的值為:50*(100-1)-sum
時間複雜性O(n),空間複雜性O(1)
考察點: 程序設計、邏輯思維能力