過去兩個月,面了幾乎所有的上點規模的IT公司,包括google,微軟,甲骨文,百度,搜狐,QQ,360,小米科技,人民搜索,百分點,雲壤,美麗說,京東,軒轅互動(現happy latte)。結果怎么樣,就不吐槽了。只是想把一些經典的面試題與大家分享下。面試崗位:c++開發工程師(初級)。
語言部分:
- 虛函數,多態。這個概念幾乎是必問。
- STL的使用和背后數據結構,vector string map set 和hash_map,hash_set
- 實現一個棧類,類似STL中的棧。這個題目初看非常簡單,當時我還有點不屑,怎么出這么簡單的題。但寫過c++和沒有寫過c++的人寫出的代碼是一眼就能看出差別的。譬如三大函數有沒有寫,引用的使用,都非常的關鍵。如果這方面沒有經驗,建議閱讀下http://book.douban.com/subject/1971825/ 這本書中簡單數據結構的實現,細節很關鍵
- c部分:函數指針的聲明
- c++中的多線程
算法部分:
- 判斷一個單鏈表是否存在循環(快慢指針的方法)
- 如何判斷一副麻將牌胡了(回朔法)
- 二叉搜索樹,節點上已經標有數字,如何找兩個節點的最小公共節點(查找第一個在兩個節點值中間的節點,如兩個節點分別是3,8,查找在3,8之間的值的節點,如沒找到,則3,8其中一個是另一個父節點)
- 二叉樹,如何找兩個節點的最小公共節點(比較笨的方法是,找到從root到兩個節點的路徑,然后兩條路徑的從root開始的最后一個相同節點就是所求節點。精妙點的參考lca算法)
- 最短摘要生成,有一個數組,還有一個集合,在數組中尋找包含集合中全部元素的最短子串。詳細可以參見編程之美3.5
- 尋找最大的K個數,編程之美2.5
- 如何判斷兩個網頁的相關性(如果說面試搜索相關的只是,看下吳軍的數學之美大有裨益,其中的向量空間模型非常優美,TF和IDF這些術語也必須知道)
- Hash的平均查找長度和裝填因子的關系(好好回味下數據結構書吧)
- 一致性hash原理
- rehash的時候可能導致插入的元素響應時間特別長,有無更好的方法?可以參考redis的rehash實現,當到了rehash的時候,不是一次性把所有的數據遷移到另一個更大的hash表中,而是每次遷移一個bucket,這樣可以平攤時間
- 如何對全是01的文件進行壓縮,一直沒有好的答案。
系統設計部分:
- 當系統的處理請求時間一定的時候,如何可以加快響應速度。(cache的使用),當時很傻,竟然沒想到這個,我給的答案是增加系統規模,這樣只能減少請求等待時間。有時候面試人就會短路,google的題,想了半天才想出來
- 兩塊虛擬網卡進行通訊,但是需要數據加密,如何實現數據加密。感覺跟ssl很像
編程部分:
- 二分查找(頻率超高)
- 建堆,順便說下建堆的時間復雜度是O(n),不是log,證明可以看算法導論
- 寫一個函數,將字符串反轉,反轉方式如下:“I am a student”反轉成“student a am I”,不借助任何庫函數 (頻率超高的一題,先反轉整個字符串,然后反轉每個詞)
項目部分:
- 因人而異