騰訊、阿里、滴滴後檯面試題匯總總結 — (含答案)

  • 2019 年 12 月 26 日
  • 筆記

年底了,近期還是收到很多小夥伴發來的面試題,因為有很多大小廠的面試題,所以我這也大概整理總結了一下,把那些比較典型有特色且面試內容比較廣泛對大家都有用處的面試題匯總了一下。以下便是匯總好的幾個大廠的面試題。

騰訊面試

萬字長文,詳細記錄了第二次騰訊後台開發社招面試流程,雖然面試流程因人而異,但就我個人感受而言,騰訊的面試從考察內容方面來講,還是有一定的共通性,這一點,可以從網上眾多的面經可以看出。

騰訊的面試的流程持續一個多月,如下:

20190919周四 第一輪電話面試,技術面; 20191008周二 第三輪和第四輪現場筆試+面試,技術面(原定9月31號,國慶推遲一周); 20191021周一 第六輪HR面; 20191023周三 offer call;

騰訊第一面

晚八點半,電話面,開始項目介紹,技術難點、實現細節。大概說了20分鐘左右,我講的內容面試官似乎沒有理解,可能是項目架構比較複雜,口述不是特別形象,又聊了10分鐘,貌似雙方誰也沒說服誰。開始聊計算機網絡、操作系統。內容包括TCP擁塞控制算法、TCP和UDP區別、進程和線程區別等等。都是常規的題目。這一塊已經很好的複習過。沒問題。時間過去50分鐘,面試官總結說我網絡協議這一塊不錯,原理和項目實戰比較強,會有下一面。

騰訊第二面

距離上一面隔了六天。電話面,大概20分鐘左右。內容如下,不分先後:

Q1. 構造函數可以是虛函數嗎?

A:不可以。原因有兩點:

構造對象的時候,必須知道對象的實際類型。而虛函數行為是在運行期間確定實際類型的,在構造對象的時,對象還沒有構造成功,編譯器無法知道對象的實際類型是該類本身還是其派生類。

虛函數的運行依賴於虛函數指針,而虛函數指針在構造函數中進程初始化,讓它指向正確的虛函數表,而在對象構造期間,虛函數指針還未構造完成。

Q2. 網絡位元組序是大端序還是小端序?

A:大端序。

Q3. Linux中如何創建進程以及創建進程後如何區分子進程?

A:使用fork()調用創建子進程,fork()調用返回兩個值,大於0的表示父進程,等於0的表示子進程。

Q4. fork創建的子進程繼承了父進程哪些內容

A:子進程繼承了父進程的地址空間,打開的文件描述符等。

Q5. fork創建的子進程繼承了父進程打開的文件描述符,如何讓這種繼承不發生

A:可以在打開文件的時候,設置FD_CLOSEXEC標誌位,如果文件描述符中這個標誌位置位,那麼調用exec時會自動關閉對應的文件。

Q6. c++虛函數原理

A:虛函數是依賴於虛函數指針實現,每個擁有虛函數的類都有一個虛表,類的對象存在一個虛函數指針,指向實際類型的虛表。虛函數運行的時候,會根據虛函數指針找到正確的虛表,從而執行正確的虛函數。

Q7. c++多態的實現

A:多態分為兩種,一種是運行時的多態,一種是編譯時的多態。前者稱為動態綁定,後者稱為靜態綁定。動態綁定時由虛函數來實現,靜態綁定是由函數重載來實現。

Q8. c++ vector和list的區別?

A:vector是動態數組,會動態進行分配內存,進行擴容操作。list是雙向鏈表。

Q9. 訪問vector的迭代器的時候可以刪減元素嗎?list呢

A:任何對vector的修改都將導致vector的迭代器失效。list因為是雙向鏈表,所以不會失效。

Q10. c++ vector的底層實現原理

A:vector底層是基於動態數組實現。

Q11. c++ map的底層實現

A:map的底層實現是基於紅黑樹的。

Q12. 紅黑樹的特點以及常見的二叉平衡樹

A:紅黑樹性能比較高,插入刪除時間複雜度保持在logn。和AVL相比,要求不是那麼嚴格,它只要求到葉節點的最長路徑不超過最短路徑的兩倍。相比之下,AVL要求左右子樹相差高度不超過一,簡單的插入或者刪除都會導致樹的不平衡需要旋轉操作。

(我只說這麼多,後來的同學建議說下紅黑樹的五個特點)

Q13. c++空類的sizeof大小

A:c++空類的大小為1,如果含有虛函數的話,大小為指針的大小。32位系統指針大小是4。c++要求即使是空類,對象也要有存儲空間。含有虛函數的空類則是因為對象由虛函數指針。

Q14. 快速排序的時間複雜度

A:快速排序平均時間複雜度位nlogn,最差O(n^2)

Q15. nLogn是排序最好的時間複雜度嗎?

A:不是,還有O(n)的算法,比如說基數排序。

Q16. 基數排序的原理以及應用

A:基數排序根據一個數的高低位進行排序。應用不知道,缺點是對負數的處理不太好。

Q17. 介紹負載均衡的應用

A:不知道。

Q18. http協議有用過嗎?

A:這個沒用過。

Q19. protobuf協議

A:我們公司之前使用的是json協議,沒有用過protobuf協議。

Q20. 數據庫

A:沒用過。

Q21. redis

A:這個是自己學習使用的,生產環境沒用過(這裡說了下,我用它幹嘛的,使用python的flask web框架基於redis的list結構開發一個網絡聊天程序)

Q22. 解釋線程安全和可重入函數

A:這個是關於多線程訪問的嗎?可重入函數這個名詞聽過,但是忘記幹啥了,面試官說pass.

(一個可重入函數被稱為可重入的,表明該函數被重入之後,不會產生任何不良後果,一個函數被重入,表示這個函數沒有執行完成,由於內部原因或外部原因調用,又一次進入該函數執行)

Q23. top的命令cache和buffer區別

A:這個平常沒有關注過。(buffer是塊設備的讀寫緩衝區,比如磁盤,cache是文件系統的緩存,常用於文件)

Q24. 常見Linux命令是否用過,比如strace和netstat

A:這個有用過,strace用來跟蹤程序的執行,top查看內存,以及tcpdump等進行抓包等等。

Q25. 多個動態庫的連接順序有區別嗎,順序怎麼排

A:有順序的,如果順序錯誤的話可能導致編譯失敗。這裡的編譯順序應該是被依賴的庫放在後面。(這個我之前工作中遇到這個坑,所以知道。不過當時面試的時候,把順序忘了)

Q26. 智力題,100本書,兩個人輪流拿,每次拿1~5本,你先拿,有沒有啥策略可以保證你可以拿到最後一本?

A:這個得承認,智力題不是我的強項,每次遇到的話都要很久才思考明白,當時考慮了大概30秒,想着100本這麼多,要不先來10本試試,我一本,他一本,我一本…….掙扎了幾秒,老實承認,沒想到啥好方法。

(此題解法可以是先手拿4本,後續雙方每次拿6的倍數,這樣可以保證最終可以拿到最後一本)。

騰訊第三面

本來約的是9月31號,因為國慶的緣故,延到國慶後。現場面,下午2點來了之後,給了一張試卷,1.5小時完成。如果難度分成5個等級,感覺介於2和3之間。試卷內容保密。總之,考察比較基礎也比較全面,C++,操作系統,計算機網絡,算法和數據結構。

3點半,兩個面試官。對着簡歷介紹項目,細節,技術難點,架構設計等等。接下來考察軟件工程原理。這部分只給出題目。答案我都總結在文檔里,題目不分先後。

1、Linux互斥鎖裏面遞歸鎖和非遞歸鎖的使用方式,返回值。

2、Golang Map是否是線程安全,如何設計一個無鎖保護的Map(可能答案是使用CAS)。

3、程序的地址空間分佈。

4、介紹Linux內存管理機制、涉及到的算法。

5、設計一個內存池。

6、設計一個定時器

7、解釋時間輪

8、Golang裏面CGO原理

9、awk和sed是啥。咋用。

10、TCP粘包怎麼解決。

11、設計線程池。

12、Golang defer語句調用順序。

13、TIME_WAIT狀態有啥用。

14、畫出四次揮手原理圖。

15、define和inline區別。

16、定義常量指針和指針常量。

17、accept是在三次握手哪一次。

18、backlog作用。

騰訊第四面

拿着手機看我的博客里有一篇介紹memcpy的標準庫函數,讓我優化。當時覺得,標準庫里的函數咋優化,能優化標準庫自己不就優化了,哪輪到我優化???但人家讓優化,肯定有優化空間,硬着頭皮上。對,就是下面這個函數,看了將近一分鐘,咋看都覺得這個函數很完美。覺得一個一個複製已經很好了,還能咋辦。問了下,能否給點提示,答曰,不急,慢慢來。又想了一會兒,還是沒啥思路,這時候,總監來了一句,「你不覺得一個一個複製有點慢嗎」。

到了這時候,還是沒啥反應,不過既然嫌棄一個一個慢,那兩個兩個複製可以么?問了下兩個兩個複製算不算優化,答曰:算。於是想到使用一個short類型複製。後來總監看我有點思路,就提示我說,從彙編角度來優化,包括寄存器大小等等。

然後,我使用long long類型來複制,即每次8個。手寫了實現,然後總監問我,如果地址不對齊咋辦?到這一步,當時沒想到地址對齊這個問題,沒有答上來,後來想了下,即使沒對齊,可以先一個一個複製等對齊了再每次複製8個。

當時對齊問題沒啥思路就pass了。感覺面試官水平很高,這道問題的水準也很高。關於優化以及編譯的問題,事後查了相關資料,這裡推薦兩本書:《深入理解計算機系統》、《程序員的自我修養—鏈接、裝載與庫》。對於優化的原理、編譯器原理講解的非常好。

void *memmove (void *dest, const void *src, size_t len)  {  char *d = dest;  const char *s = src;  if (d < s)  while (len--)        *d++ = *s++;  else      {  char *lasts = s + (len-1);  char *lastd = d + (len-1);  while (len--)          *lastd-- = *lasts--;      }  return dest;  }

繼續做題。

N個M長度數組求交集,求最優解並給出時間複雜度和空間複雜度。我給出的方案是歸併、去重、全排序。然後問了下為啥用歸併排序,於是介紹快排、歸併、堆排各自優缺點和使用場景。然後問有沒有更好的解法。想了下,給出了優化方案,仍然是歸併,去重,然後hash。然後過。

第三題,c++手寫單例模式,《劍指offer》第二題。

因為簡歷上有些會shell開發,然後給出第四題:

給定一個日誌文件,每行包括日期,IP地址,錯誤碼。然後讓我使用shell搜索指定日期,指定IP,指定錯誤的日誌出現次數。簡單題,grep -rns "date + IP + error" | wc -l

看我的答案之後,在這個題目加了下擴展,除了前述三個內容,還有第四列content,每一行都不一樣。馬上給了答案:

awk -F"|" "print112 $3" | grep -rns "date + IP + error" | wc -l

應該是考察我awk的使用。這裡提醒各位同學,自稱會shell開發一定要掌握awk和sed的使用。基本上,面試官看到自稱會shell必考。

整個面試流程持續四個小時。出門已是18點

騰訊第五面

距離三面和四面隔了7天,期間沒有任何消息,以為涼了。結果來了電話,約複試。

複試的內容沒有特殊之處,依舊是基礎。內容如下:

1、介紹前公司產品的功能、市場競爭力、自己負責的部分、產品的軟件架構

簡要介紹下前公司的產品、功能、市場競爭力,雖然咱是搞技術的,但是關於產品市場的事情,平常工作中還是多多少少有所關注。此外,就是介紹產品的軟件架構圖,以及自己負責的模塊等等。很多同學遇到類似的問題,會說,自己只負責一個部分,不知道產品的整體架構。這樣回答,往往給人的感覺就是很水,搞技術的,不會可以,但是不會可以學啊,雖然,整體架構沒涉及過,但是,沒吃過豬肉不能沒見過豬跑。做了那麼久,產品啥架構還不了解,這就有點說不過去了。所以,建議各位同學平常工作過程中,有空的話也從整體的角度思考下產品,萬一哪天需要自己搞呢。

2、路由NAT如何實現

這一塊沒有接觸過。畫了一個映射圖,大概描述了一下。

3、考察結構體位元組對齊問題

4、概率題,兩個紅球一個白球,三個盒子。問第二個盒子至少一個紅球的概率

考察概率論。剛開始拿到題,以為需要算法。想了一會兒沒啥好方法,略顯尷尬的說,使用枚舉吧。所謂暴力法。畫了一個多叉樹的圖,一目了然。事後想來,枚舉才是最簡單的方法。

5、編程題,字符串去空格

6、進程、線程區別。為什麼有了多線程還是用多進程

基本的操作系統原理題。後面的問題只說了進程地址空間有限,不能創建任意多的線程。回來想了下,更好的回答應該是,進程是一個程序實體,多個程序需要多個進程。此外,進程地址空間相互隔離,安全。

7、平時如何定位問題,core dump怎麼產生的

通常線上問題先復現、再定位。core dump怎麼產生不知道。後來查了下,當程序有未處理的信號時,內核會自動生成core dump。能否生成core dump還有ulimit -c的限制。

8、構造函數調用虛函數可不可以

不可以。說了下虛函數的作用以及構造函數的調用順序。後面又問,如果調用會出現啥情況。因為不確定所以說不知道。回來測試了下,是調用被調對象的自己的版本。

9、算法題:給定電話號碼加區號,如何快速查找對應地區

區號佔4位。給了長度10000的數組做hash,O(1)。問有沒有辦法提高空間利用率,沒想到。想到的同學告訴我。然後給了紅黑樹存儲,時間複雜度O(logN)太高。

10、常用的IDE

C語言使用source insight,Golang使用liteide。

11、線程調度問題

這裡解釋了下兩種調度類以及它們的調度策略,然後是底層的實現原理,後來問調度過程的具體步驟,我記得內核的調度函數是schedule(),具體的操作沒有分析過,這裡只說了大概,保存寄存器、上下文,然後加載被調進程的上下文、寄存器等等。

12、不同編譯器編譯的庫能否混用

沒用過,不知道。後來查了下,不同版本的編譯器編譯出來庫不能混用,不過網上的回答也沒有解釋清楚。覺得可能在問extern "C"問題。

13、離職原因,離職這麼久都幹嘛去了

14、閱讀源碼有啥好處?對以前的項目有沒有啥改進之處?

15、有什麼問題想問的

問了下直播業務涉及的終端以及後台開發過程中使用到哪些中間件技術。然後,問了下騰訊的服務器內核啥樣子,回答說是定製的T-Linux內核。

整體感覺面試愉快,面試官也在考察知識深度,不會的也沒關係。

騰訊第六面

距離複試三天時間,中午電話。

1、為什麼學些德語

2、第一份工作學習到啥

3、對騰訊怎麼看

4、期望薪資以及依據

5、當前薪資、福利

6、以前是通信的,對互聯網怎麼看

7、部門業務量很多,可能需要加班,你怎麼看

8、有什麼問題想問的

兩天後,給了offer。騰訊的面試流程大體這樣,技術面考察的都是基礎,要有深度,不能停留在表面。自己前前後後準備了四個月,從第一次的慘敗到後期的從容面對,一步步走下來,收穫滿滿,最終得到想要的結果

阿里後檯面試

阿里一面(電話面試一小時)

首先做一個簡單的自我介紹,主要包括學校經歷和工作經歷。我工作經歷只有一年,大部分時間都是在做產品設計和UI/UX Design,因此隔着電話都能感受到面試官的shock。

  • Java基礎。自動拆裝箱如何實現,String,StringBuffer,StringBuilder的異同以及各自的實現。
  • JVM基礎。JVM的內存模型,常見的垃圾回收算法。
  • 事務ACID,編程時如何保證事務,分佈式情況下如何保證事務。
  • 由於分佈式相關場景我沒有接觸過,因此面試官一直誘導我去設計實現一個分佈式事務。
  • 數據庫樂觀鎖和悲觀鎖。如何實現一個樂觀鎖。
  • 消息隊列使用場景,Kafka的架構以及原理。
  • 什麼是restful api,和rpc調用有什麼區別。
  • 單例的幾種寫法。volatile關鍵字有什麼作用。

以上就是電話面試的大體問題,面試完之後,又發給我三道算法題目,要求我一小時內完成,下面是三道算法題:

  • 翻轉一個long類型數字。例如輸入123456L,輸出654321L。- Leetcode翻轉integer的變種。考察能否正確處理溢出的情況。
  • 輸入一個double,要求返回與它最接近的.49或.99的數字。例如12.77返回12.99,11.02返回10.99,12.61返回12.49。
  • 有三個線程ABC分別向一個數組中寫入a,l,i,要求最終的寫入結果形如alialiali…寫入次數由A線程決定。

這三道題目做的還比較順利,第二天面試官又聯繫我闡述一下第一題和第三題的思路,然後通知我可以參加下一輪了。

二面(電話面試一小時)

二面主要考察了一些開放式的問題。

  • 首先還是自我介紹。主要是工作後的經歷。介紹一下工作一年所在team的產品,我承擔了什麼職責。
  • 開放式問題。如何設計一個rpc框架。
  • 開放式問題。如何設計一個服務註冊中心。
  • 集合類源碼。HashMap是如何實現的,擴容的過程,為什麼要擴容為2倍。HashMap中的鏈表替換為數組可以嗎?時間複雜度相同嗎?
  • 集合類源碼。線程安全的HashMap是什麼?(HashTable和ConcurrentHashMap)ConcurrentHashMap是如何實現的?(Java7分段鎖和Java8的CAS+Lock)和HashTable相比有什麼優勢?
  • 紅黑樹的結構,時間複雜度是多少,如何計算的
  • 什麼是CAS操作,如何實現一個自定義鎖
  • 數據庫設計。有一張很大的order表,如何設計能夠提升查詢效率(同時滿足根據買家id和賣家id查詢)?

二面也同樣是一小時左右,面試過程還算順利。只是當時我在廈門鼓浪嶼的一家小餐館吃晚飯,周圍的嘈雜和悶熱使我很煩躁,感覺面試官態度有些傲慢……ps.一面二面結束後面試官都各種暗示我要瘋狂加班能不能接受blabla……

三面(電話面試一個半小時)

二面結束後的第三天,就收到了現場三面的通知。然而我還在廈門旅行,因此改為了電話面試。 三面是一個大Boss,因此面試的問題都更考察一些分析問題的能力。

  • 介紹一下你工作一年學習到什麼?所在項目的架構是什麼樣的?UI/UX設計有哪些規範(由於我說我學到了一些UI/UX設計方法,因此面試官就問了)?
  • 數據隔離級別,臟讀幻讀。
  • 線程池原理。
  • Synchronized的實現,鎖的升級過程。
  • K8s的作用,K8s的底層架構。
  • 對我業餘時間做的一些項目做了介紹。
  • 你覺得加入阿里你能給阿里帶來什麼?
  • 進入阿里你需要忍受很多困難,需要迎難而上,如果績效考評拿到差評,你會怎麼辦?

三面總的來說也還算順利,面試官也算和藹。

總結

整個流程從一面到三面結束大約持續了10天左右。總的來說,問題都是預期範圍內的,雖然面試過程中問到了一些分佈式相關問題,我都沒有任何經驗,這時候不要放棄,主動說出你的思路,然後在面試官的誘導下,相信你能說出屬於的答案。

滴滴java研發

滴滴一面

1、自我介紹

2、為什麼離職當前平台發展有限,項目進入穩定期,新需求不多,維護為主,對個人發展不利

3、說一下HashMap的數據結構,複雜度這裡可以以put方法作為切入點,把put方法分析出來,數據結構和複雜度就自然出來了

4、有沒有多線程的使用經歷,如何進行的優化講了項目中的一個多producer多consumer的一個實現,用到了juc包中的countdownlunch,原子類,BlockingQueue等

5、MySQL用過么?講一下索引的數據結構,怎麼分析查詢效率講了innodb複合索引的b+tree模型,最左匹配原則,查詢效率的explain分析 6、redis用過么?redis怎麼保證查詢速度純內存操作;單線程多路復用模型;HashMap的數據結構

7、用過什麼消息隊列?為什麼用RabbitMQ?應用場景有什麼?有沒有和其他mq作比較用過RabbitMQ;場景:削峰填谷 異步調用 解耦 擴展性;沒用過其他mq

8、遇到過什麼線上問題?怎麼做排查先看日誌報錯,死鎖的話看dump,jstat分析gc狀況,服務器可連接的話可以用visualvm

9、你有什麼要問我的問了團隊組成,業務方向,我要做什麼

最後留了一個算法題::LeetCode 236. 二叉樹的最近公共祖先 手撕了一遍,middle難度

滴滴二面

二面面試官先看了下上一輪的代碼,簡單對了下邏輯,然後開始面試

10、介紹一下項目

11、項目中負責什麼

12、項目中做了什麼優化講了下項目中RabbitMQ實現了at least once,包括mq反饋provider,消息持久化,consumer主動反饋mq,線程池消費防止消息積壓等

13、講一下springmvc的原理我沒用過springmvc,之前用的ssh,後來就直接SpringCloud加springboot了。這裡憑印象答了一下,註冊dispatcherServlet,將request按照url分發給不同的controller處理,controller調用service+dao等處理業務,之後response返回

14、看過什麼源碼?簡單說一下看過spring源碼,簡單說了下spring如何處理循環引用,其實答ioc和aop更好些

15、問了兩個java基礎,記不清細節了

16、你簡歷里還寫blog?看了下我的blog~

17、有什麼要問我的?問了還會不會有下一面,哈哈,面試官也樂了,說會有下一面~

主管面

18、介紹下自己的經歷,以及每一次跳槽選擇的原因

19、說一下java的幾種鎖這裡我把幾種鎖的原理,用法和應用場景對比都說了,包括volatile

20、說一下項目中遇到的最大的困難,你是怎麼解決的

21、你堅持最久的事情是什麼?堅持了多久

22、你的朋友怎麼評價你?講真這個真的毫無準備,完全臨場說了一通

主管面的確比較偏向價值觀,方法論等等,給人的感覺就是通過幾個問題就能摸出來你的性格,技能等等…

hr面

23、為什麼想離職?

24、手上有沒有其他offer,哪兒?

25、期望,現在的職級

一二面各持續了一個小時左右,主管電面半個小時,hr聊了十幾分鐘。

整個面試過程就這樣~