2014年騰訊面試試題8道
1. 根據(jù)以下代碼?
int ack(int m,int n)
{
if(m == 0)
return n + 1;
else if(n == 0)
return ack(m-1,1);
else
return ack(m – 1 , ack(m , n-1));
}
如果ack(3,3),。結(jié)果為多少
2. A,B兩個(gè)整數(shù)集合,設(shè)計(jì)一個(gè)算法求他們的交集,盡可能的高效。
我的回答的:如果對于數(shù)據(jù)較小(10W以下)我會采取哈希的方法去求數(shù)集較小的那個(gè)集合的hash值存在hash表中,然后對另一個(gè)表中每一個(gè)數(shù)進(jìn)行hash,如果在hash表中找到則這個(gè)數(shù)是交集的數(shù),輸出。這個(gè)算法時(shí)間效率是O(n+m),空間效率O(3n+m);(因?yàn)閔ash幾乎浪費(fèi)掉一半空間)
對于大數(shù)據(jù),我則先把數(shù)據(jù)hash%100的樣子分到許多個(gè)小文件中,然后對這些hash值的次數(shù)建立一顆二叉查找樹,遍歷另一個(gè)集合的數(shù)來找,找到一個(gè)就輸出一個(gè),最后得到集合數(shù)。算法效率是O(n/100*m*log(n/100)),空間效率O(n+m)
3. 請?jiān)O(shè)計(jì)一個(gè)排隊(duì)系統(tǒng),能夠讓每個(gè)進(jìn)入隊(duì)伍的用戶都能看到自己在隊(duì)列中所處的位置和變化,隊(duì)伍可能隨時(shí)有人加入和退出;當(dāng)有人退出影響到用戶的位置排名時(shí)需要及時(shí)反饋到用戶。
4.怎么在linux下查找一個(gè)文件中有多少個(gè)給定的字符串
答:這題本來想考察我的shell編程的能力吧,不過我說這個(gè)不會,然后他問我如果寫程序?qū)崿F(xiàn)呢
我答我會用trie樹去記錄字符串出現(xiàn)的次數(shù)
然后有被問道更深入一點(diǎn)的,如果文件過大呢?
我答,那就把文件內(nèi)容hash取模分成多個(gè)足夠小的文件,然后每個(gè)小文件trie記錄結(jié)果,輸出一個(gè)小文件,最后把所有結(jié)果文件合并就可以得到最終結(jié)果
5. 寫二叉查找樹的查找算法,答案就不寫了,簡單。
寫完之后,面試官又問我由這里到一個(gè)什么地方的,要求最短時(shí)間,怎么求
這個(gè)就是問最短路算法,我就答了這個(gè),然后他又問我怎么知道去的路徑通不通,我答用傳遞閉包去計(jì)算,
他問我如何傳遞閉包,然后我就畫圖演示了一下這個(gè)過程
6. 進(jìn)程與線程的區(qū)別
這題我答得非常不好,我只答了進(jìn)程有資源,線程沒資源,進(jìn)程個(gè)數(shù)有限,而線程的個(gè)數(shù)幾乎不限,進(jìn)程的調(diào)度慢,線程的調(diào)度快這些基礎(chǔ)點(diǎn)
但是被問到為什么進(jìn)程調(diào)度比線程慢時(shí),我答不出,我答是因?yàn)橛脩魬B(tài)和內(nèi)核態(tài)的轉(zhuǎn)換造成的,但是百度一下,答案應(yīng)該是因?yàn)榫€程調(diào)度是在進(jìn)程中進(jìn)行,在同一存儲區(qū)內(nèi)操作,而進(jìn)程則在不同存儲區(qū)操作,所以進(jìn)程調(diào)度數(shù)度比線程慢
7. 問我TCP/IP有多少層
我答OSI標(biāo)準(zhǔn)有7層,但是目前工業(yè)大多使用5層的標(biāo)準(zhǔn),然后回答了一下這些標(biāo)準(zhǔn),我只會答5層標(biāo)準(zhǔn)的那一個(gè)。。。
接著又問我IP層(網(wǎng)絡(luò)層)的作用,
我答了很多,又說了什么TCP、UDP的,然后在面試官的知道下,我才答出,網(wǎng)絡(luò)層的作用是映射作用,主要是IP和MAC地址、端口的映射(我不知道對不對。。)
接著又問我TCP和UDP的區(qū)別
我就答,TCP是有連接的,UDP是無連接的,TCP通過三次握手保證數(shù)據(jù)的可靠性,UDP則沒有
最后還問我滑動窗口的東西,我就答了滑動窗口是為了保證數(shù)據(jù)被客戶端正確接收了,他又問我為什么能保證,然后我就畫圖演示滑動窗口的發(fā)送、接收、移動過程
8:寫一個(gè)函數(shù),計(jì)算給定的一個(gè)整數(shù)中有多少個(gè)0