1. 程式人生 > >騰訊實習面試總結

騰訊實習面試總結

研究生第一次與面試官面對面的“面”試,也是迄今為止與offer離得最近的一次面試。可惜最後還是跪在了二面,敗在了細節和基礎。二面基本一直在寫演算法,演算法比較基礎,但又側面考察程式設計邏輯思維的嚴密性,memmove函式的實現,主邏輯並不複雜,主要考察對特殊情況的處理。由於沒有面試經驗,每次寫完程式很少檢查就直接拿個面試官看,導致程式有很多低階錯誤。

一面:

一、專案相關

專案介紹,面試必考。考察方式類似。

1. 在簡歷上列舉的專案中挑選一個收穫最大的專案,手繪專案的模組圖,通過模組圖介紹整個專案。

2. 專案中使用的關鍵技術,針對提到的關鍵技術,展開提問問題。

3. 遇到的最大難題,解決的方法。

二、Linux相關的基礎知識

1.程序間通訊的方式都有哪些?什麼時候選用哪種通訊方式?

http://blog.sina.com.cn/s/blog_6002b97001013wec.html

2.兩個程序通過共享記憶體通訊,可否將程序1某個變數的指標的地址存入共享記憶體,然後程序2讀取共享記憶體的中的指標,通過該指標訪問程序1種的變數?

待編輯

3.IO複用中select函式,poll函式和epoll函式的區別。

http://www.cnblogs.com/Anker/p/3265058.html

三、程式碼實現

實現memmove函式

http://blog.csdn.net/hgj125073/article/details/8468746

二面:

一直在寫程式碼……至今還清晰的記得那個清秀的面試官輕輕的說了一句:“多說無益,我們直接開始寫程式碼吧!”於是一個半小時過去了……

多說無益直接上題!

1.在1000億零一個int型數字選出其中位數(思路題)。

http://blog.sina.com.cn/s/blog_4a8aac970100093j.html

2.判斷一個集合是不是另一個集合的子集,集合為int型整數集合

設較長的集合為S1,長度為m;較短的集合為S2,長度為n。

第一種方法,將兩個集合排序,然後依次查詢S2集合是否在S1中,若均在則S2是S1的子集否則不是。

由於S1,S2均已排序所以只需要遍歷S1一遍就可以得出結論,演算法複雜度為O(nlogn+mlogm);

第二種方法,使用hash表,先將S1遍歷並對映到hash表中,然後遍歷S2,判斷其元素是否已在hash表中,若均不再則S2是S1的 子集否則不是。

可以使用hashmap,查詢效率約為O(1),總體演算法複雜度約為O(m+n);

3.實現大數加法

http://www.cnblogs.com/zhangchaoyang/articles/2727225.html

常見的演算法是將大數當做字元處理,如7834927598432759827當做字串“7834927598432759827”,一個數字佔一個位元組,然而一個位元組可以表示0-255,我們只需要表示0-9所以只需要4bit(char c:4)就可以,這樣可以更節省空間。

4.因為一面的memmove寫的有問題,二面又實現了一遍memmove

答案同上面memmove函式實現。

寫演算法的時候涉及到了new/delete,面試官問了一個C++底層的問題,在new一個數組時,為什麼delete在釋放記憶體的時候只需要指出釋放空間的起始位置而不用顯示的指出陣列的大小?

當時只知道new函式申請堆空間時,陣列的大小應該已經儲存下來,但不知道存在哪了。後來回來在網上查了一下,原來使用new函式申請堆空間的時候,會額外申請四個位元組的空間用來儲存申請陣列的長度。關於new和delete更詳盡的說明可以參考部落格http://blog.csdn.net/nodeathphoenix/article/details/39693865。

除了以上演算法題外,面試官讓我翻譯了一段英文文件。