一面主要問了很多基礎知識
1.自我介紹
2.大學做過的項目(具體點)
3.項目中主要用到的技術
4.說下你知道的排序算法,並說出他們的複雜度(說了6個 冒泡,插入,選擇,快排,堆排,歸併)
5.二叉樹的遍歷方式(四種)
6.說下你對遞歸,動態規劃,回溯的理解
7.說下二分查找
8.如何判斷兩個鏈表是否相交?
9.AVL樹,紅黑樹,B樹的區別
來點計算機網絡
9.講下TCP的三次握手
10.講下瀏覽器從輸入url之後的整個過程,越具體越好
11.講下TCP的擁塞阻塞的方式(慢啓動,擁塞避免,快重傳,快恢復),具體展開講
12.TCP的七層模型,然後問數據段在那一層,加密解密在哪一層?
13.TCP滑動窗口原理
14.看你簡歷上寫了解設計模式,說下你知道的設計模式(單例,模板,工廠,迭代器,適配器)
15.具體說下單例的實現(昨天頭條剛面過這題的手寫)
16.進程與線程區別
17.線程間的通信(具體講每一種是什麼意思)
18.網絡IO編程模型(同步,異步,阻塞,非阻塞IO)
19.最後是一道算法題:說必考一道兩道編程題
20.最長迴文串思路(佳鵬哥那題沒想到一面就遇到了,幸好只是說思路,不然寫代碼又得花很長時間)
總結:一面主要問的都是基礎問題
2面
1.首先是兩道編程題,另外第一題的話要求給出非遞歸的版本(一面剛好遇到迴文串的問題,剛好用上了,昨天頭條面到了完全二叉樹的思路剛好可以用上。)
2.蘋果樹
一開始說了一個最簡單的寫法,就是創建一個結果數組res[b.size()];
然後for(int i = 0; i < m ; i++){
for(int j = 0 ; j < a.size() ; j ++){
if(a[j] < b[i]){
res[i] = res[i] + a[j];
a[j] = 0;
}else{
res[i] = res[i] + b[i];
a[j] = a[j] - b[i];
}
}
}
接下來面試官問有沒有數據結構能夠做這個題目,想了幾分鐘,面試官說下一題,我說是不是堆,然後他說回頭你自己向下,最後我反問的時候又重新說了下那個題目可以優化的地方在於不要繼續算0
3.你覺得自己筆試成績怎麼樣
4.問點語言基礎把
5.談談你心目中的C++(把C給痛打一頓之後,開始吹捧C++)
6.指針和引用的區別
7.四種類型轉換
8.再來一道題目,講前綴樹怎麼實現
9.聊下你的學習情況,課餘時間外有沒有主動去接觸一些知識
10. 你簡歷中有寫用到多線程,你能說下線程池的實現嗎?(臥槽,怎麼還有題目....)
11.具體說下你研究生的項目把
12.反問:一道題一般思考多長時間比較合適?那邊主要做什麼的?
總結:二面主要問的是算法題,C++基礎,工程應用
三面:
以爲涼了,二面面試官沒說有下一輪,隔了一會兒牛客網狀態變了,說有三面。
1.自我介紹
2.在哪個平臺開發?Linux平臺
平時怎麼調試程序的?
2.來做一道題目把,有兩個有序數組,怎麼去找到他們倆的交集
我:首先遍歷第一個數組,然後建立一個哈希表,接下來遍歷第二個數組,查看哈希表中是否存在這個數。
面試官:嗯嗯,那你分析下時間複雜度。
我:遍歷一次數組o(n1),建立一個哈希表o(n1),然後遍歷第二個數組o(n2),所以時間複雜度o(n1+n2),空間爲o(n1);
面試官:嗯嗯,那能不能利用它的有序特性呢?
我:我想下(幾分鐘後),繼續是有序,那麼可以考慮二分,對於第一個數組中的每個數,我們都會它在第二個數組中進行二分查找,然後如果存在就加到有序數組中
面試官:你分析下這個的時間複雜度以及空間
我:遍歷第一個數組的每個數在第二個數組二分,所以時間複雜度是O(n1 * Log(n2)),空間複雜度爲O(1)
面試官:能不能再優化一下
我:我想下(幾分鐘後),對於第一個數組中的第一個數字,我們進行二分,我們假設一種簡單情況,就假設能夠再第二個數組中找到那個元素,記爲p2
接下來,對於第一個數組中指針每次移動一個,第二個數組如果小於,就往右移......(越說越亂)
面試官:那你分析下複雜度
我:O(n1+n2),空間爲O(1)
捏了一把漢,終於挺過這個題目了。
3.面試官:我們再來看一個題目把,就是有海量的URL,如何對他們進行去重?
我:(心裏想着GG,大數據方面沒看過啊.......)然後就說了用hashmap存儲遇到的url,如果遇到重複的就不加進去。然後說不知道海量和正常數據有什麼區別?感覺都可以這樣處理把。
面試官:海量的話,你單臺機子裝不下去。
我:(直到寫面經的時候,我才發現我原來理解錯題意了,面試官的意思估計是說單個機子內存放不下,我他媽以爲是硬盤裝不下去.....)我說hash到不同機子去查表
4.智能指針知道嗎?說一下每種指針的應用場景是什麼?
獨佔unique_ptr用於只能由一個對象的時候,比如cout,打印機等資源
共享shared_ptr用於共享對象,能夠減少內存的消耗
弱指針weak_ptr主要用於解決共享指針導致的循環引,導致釋放的時候出現內存謝列
5.講下線程的同步方法
6.再做一道題目把,重建二叉樹的題目(只需要說出思路)
7.場景題:App的活躍用戶峯值(需求說的非常模糊),你完全不知道你有什麼數據可以用。然後問有沒有什麼可以用的數據,後面用扯到了說是實時的數據流,最後問題壓縮到如何判斷當前時間(精確到秒)有多少個用戶活躍?(說了應該得看服務器端有多少個TCP連接了).
8.剛纔那道重建二叉樹得題目,給出你做測試得方案。
9.具體講下你研究生的這個項目是怎麼做的?
10.數據庫瞭解嗎?不瞭解XXX
11.網絡編程瞭解嗎?最近剛開始看xxx
12.Linux輸出第二列的全部內容? 不會....知道這個是linux文本操作的內容,但還沒複習到,然後就平時用到的一些Linux指令
10.能夠實習多久?xxx
11.反問環節。哪個部門,主要工作,對自己的表現給點建議。
總結:算法+場景題+基礎
許願OC