2022/03/09 螞蟻電話面試覆盤
螞蟻大安全部門實習生電話面試,第一次面試給了螞蟻,感覺表現得不太好,覆盤一波。
自我介紹
沒有拿得出手的專案,有點僵硬,得加緊一下進度,3月份爭取照著github上的webserver自己做一個出來。
C++
-
談一下對面向物件的理解
這一塊講得一團亂,說出繼承、封裝、多型之後混在一起講了,應該從這三者出發分別講清楚,也是自己之前沒有系統性地敘述過,腦子裡有概念講不出來。 -
提到了虛擬函式,講一下C++是怎麼實現虛擬函式的多型的效果
就是虛擬函式表以及指向類的虛擬函式表的指標,派生類覆蓋基類的虛擬函式時會用虛擬函式表裡對應的指標替換,這樣呼叫的就是派生類裡的虛擬函式。 -
建構函式可以是虛擬函式嗎?
顯然是不行的,要呼叫虛擬函式先要有虛擬函式表,指向虛擬函式表的指標要在建構函式裡進行初始化,如果建構函式自己是虛擬函式就相當於陷入了一個死迴圈。 -
靜態連結和動態連結的區別
這個我扯了一堆靜態庫檔案和動態庫檔案的編寫,還有編譯的過程;其實看到靜態和動態就應該想到編譯期和執行期,靜態連結就是在編譯連結可執行檔案的時候就把靜態庫檔案連結到可執行檔案裡,動態連結則是在執行可執行檔案的時候再去找要連結的內容;顯然兩邊的優缺點就是靜態連結執行起來快但是編譯慢而且修改庫檔案很麻煩,動態連結編譯起來快而且更新方便但是執行慢。 -
怎麼設計不可以複製的類(《Effective C++》內容)
這個就是把拷貝建構函式和operator =賦值函式都定義成private函式就行了,外部無法呼叫。
STL
-
map和unordered_map的區別
map的底層是基於紅黑樹來實現的,內部元素排列有序,unordered_map底層是用雜湊表來實現的,元素無序。-
查詢時間複雜度
map是O(logN),unordered_map平均是O(1),最差是O(N)。 -
unordered_map最差複雜度O(N)是因為發生了雜湊衝突,那麼解決雜湊衝突的方法有哪些?
撞到知識盲區了,查了一下有這麼幾種常用的方法:
- 開放定址法:一旦發生了衝突,就去尋找下一個空的雜湊地址,只要散列表足夠大,空的雜湊地址總能找到,並將記錄存入。
- 再雜湊法:顧名思義,衝突了就用第二個雜湊演算法,再衝突就用第三個,簡單粗暴。
- 鏈地址法:將所有具有相同雜湊地址的而不同關鍵字的元素連線到同一個單鏈表中。
- 建立公共溢位區:將雜湊表分為基本表和溢位表兩部分,凡是和基本表發生衝突的元素,一律填入溢位表。
-
查詢時間複雜度
演算法
-
介紹一下熟悉的排序演算法以及時間複雜度
這個真是翻車了,本來應該講得比較好才對的,結果有點沒記得很清楚,講得略亂,這裡重新寫一下,這些基本知識還是得常看常新。- 氣泡排序:O(N2),穩定
- 插入排序:O(N2),穩定
- 歸併排序:O(NlogN),穩定
- 快速排序:O(NlogN),不穩定
- 堆排序:O(NlogN),不穩定
- 桶排序:O(N + k),穩定性依賴對桶內元素進行排序的過程
- 選擇排序:O(N2),不穩定
- 希爾排序:O(N(logN)2),不穩定,插入排序的改進
- 計數排序:O(N + k),穩定
- 基數排序:O(Nk),穩定,桶排序的擴充套件
-
找出一組數中第5大的數字應該用哪種排序演算法
顯然是堆排序,建一個大小為5的小頂堆然後把所有數往裡丟,堆超出大小了就把堆頂的元素丟擲去。 -
講一下快速排序的實現
這個還行,講上來了,主要介紹了一下快排的思路,如果直接手撕程式碼可能會卡一下。 -
STL裡面本身的sort()用了什麼排序演算法?
這個好久之前在知乎上看到過,但是記不太清了,就說上來根據元素個數不一樣會選擇不同的排序演算法,有堆排序也有快速排序。查了一下,發現一共用到3種排序演算法,分別是快速排序、插入排序和堆排序,在資料量較大時呼叫快速排序,分段歸併排序,當分段後的排序區間小於16時會改用插入排序,而如果快排的遞迴層次過深就會改用堆排序。 -
講一講平衡二叉樹
平衡二叉樹的左右子樹都是平衡二叉樹,而且左右子樹的高度差不能超過1。(這裡先說成是一樣的,大霧,還好改口了) -
層序遍歷的實現
二叉樹的經典演算法了,這個說的應該是比較清楚的。
計算機網路
-
TCP和UDP的區別
基本上都說出來了,雖然可能有點亂,這裡都整理一下。- TCP面向連線,UDP是無連線的;
- TCP可靠,UDP不可靠;
- TCP面向位元組流,UDP面向報文流;
- TCP有流量控制、擁塞控制,UDP不管這些;
部分沒說上的: - TCP是一對一,UDP支援一對一、一對多\多對多;
- TCP首部開銷20位元組,UDP只有8位元組.
-
TCP的四次揮手
其實三次握手記得更清楚一點,不過也大概說出來了.- 客戶端沒有資料需要再發的時候,發起第一次揮手,告訴伺服器資料發完了,傳送FIN=1;
- 伺服器接到後傳送ACK=1,不過這時候伺服器可能還有資料沒發完,所以接下來還有;
- 伺服器發完資料後再發送一個FIN=1給客戶端;
- 客戶端收到伺服器傳送的訊息後回覆ACK=1,這裡有一個2ms的延時等待.
-
客戶端2ms延時等待的意義?
客戶端發過去的訊息可能沒被接收,伺服器可能會重新發送釋放連線狀態的訊息過來,這時候就要重新發送ACK=1保證伺服器關閉,超出2ms後就認為伺服器已經關了. -
HTTP裡面除了GET和POST還有哪些常用的請求方法?
學的時候因為這一塊之前不是考點,基本上都忘光了,沒說上來.重新翻了一下,還有HEAD\PUT\DELETE\CONNECT\OPTIONS\TRACE\PATCH這些,這些都沒咋背,hh.
作業系統
作業系統這塊基本上處於還沒咋看的狀態,雖然之前看了一下《程式是怎麼跑起來的》,但是對比了一下面經裡經常出現的問題感覺那本還是太簡單了,後面準備用CSAPP來學一下作業系統這塊吧.
總結
面試官很和善,我自己倒是感覺有一堆沒說好的點,還有好多知識盲區,最近也是有點懈怠了,部落格好久沒更新了,還是得酬勤起來啊,接下來準備在3月把webserver的專案初步做完,4月和5月學完作業系統,後面再看一下資料庫結合資料庫在6月再做一個專案,如果能實習最好,不行就靠自己做專案,部落格重新寫起來,加油衝!