1. 程式人生 > >C/C++面試

C/C++面試

首先說明,此帖針對的是非計算機專業想轉網際網路開發的童鞋,C/C++後臺開發方向,想起自己在準備階段也經常水河畔,看了一些面經對自己確立方向和需要準備哪些上幫助很大,所以也分享下自己的經歷,希望對大家有所幫助。
基本情況:電工碩士,教研室專案就是matlab模擬,自己毫無興趣,一心想從事網際網路軟體開發,但無網際網路方面的專案經驗,無實習經驗(這一點面試時很傷),自己準備的是C/C++後臺開方向,現已簽約華為,最近收到騰訊offer,打算毀約籤鵝廠(毀約之路困難重重)。
一:準備階段 因為自己較早就決定找C/C++後臺開發崗位,所以主要準備了以下幾大塊:
1.C/C++:自己先從《C++primer》看起,然後是《Effective c++》(重點推薦),《STL原始碼剖析》、《深度探索C++物件模型》(只看了部分),C++差不多就這些,在準 備C++的同時,也不能忽略C的重要性,在看linux系統及網路程式設計就會體會到,指標要非常深刻地理解(應付面試也要蒐集一些常見的坑、常問的問題)。 2.作業系統:如果做後臺,感覺linux必須會,推薦《UNIX環境高階程式設計》,個人覺得非常重要的一本書,很經典,重點理解:程序、執行緒,多程序多執行緒間通訊,I/O操作 (特別是多路I/O); 對linux整體認識方面,推薦《linux鳥哥私房菜》,這本書可作為手冊翻翻就行了,重點掌握一些常用的指令,時間允許的話,shell也可以學一下;
作業系統概念理解方面,《現代作業系統》,重點理解程序,執行緒,虛擬記憶體,也可結合《深入理解計算機系統》,感覺某些章節講得很好。 3.網路程式設計:很重要的一塊,面試集中在TCP/IP協議上,《TCP/IP協議詳解:卷一》多看幾遍,然後就是《UNIX網路程式設計卷1》,書太厚只看了部分章節,但講得很經典,看書 的同時要多動手在linux系統上多實踐 4.資料結構與演算法:幾大排序演算法和查詢演算法,連結串列、二叉樹,多刷刷題,《劍指offer》多看幾遍,刷題網站:牛客網,leetcode 上面重點講了自己看了哪些書,這些可操作性強一點,但也不能忽略專案實踐的重要性,一定要有一兩個拿得出手的專案或者有實習
(非常重要),但這個我沒法提建議,我是參加了華為的軟體挑戰賽,自己整了個後臺開發的小專案,面試時重點講這兩個。

二:面試階段   就按自己面試的時間順序講吧,重點講問了哪些問題,所有面的都是軟開崗位
1.中興(提前批,拿到offer) 中興是自己的處女面,當時還有點緊張,但問的問題較簡單,記得的有:寫一段程式碼輸出九九乘法表,if (p==NULL)有什麼不妥的? 二面的一個問題:在一個專案已完成80%了,客戶突然說要改需求,你作為專案主管會怎麼辦?
2.華為(提前批,拿到offer) 因為自己之前參加軟體挑戰賽,進了複賽,所以參加的是7月底的比賽專場面試(後面看來用處不大)。當時是先進去做性格測試再面試,後來才知道自己第一次性格測試掛了, 第二次做過了,提一點建議(僅作參考):每組題目選擇時 一定要有區分度 ,即每組題目不能選太多相同程度的。
一面: 1)看我華為比賽進入了8強,讓我好好講講我們的方法,團隊分工,並說說自己做了哪方面的貢獻 2)既然你們的比賽題目是尋路的,那坦克大戰也是尋路的(後面想想好像關係並不大),讓你設計這個遊戲,你會怎麼設計?(扯了點面向物件的設計,多型等) 3)你好像對面向物件比較瞭解,那談談你對多型的理解?(。。。。。。)對設計模式瞭解嗎?(不知道,這裡有點自己把自己帶入坑的感覺,所以面試時自己對面試官的引導   很重要,要避免引入自己不熟悉的領域) 4)給了我張紙,讓我看下上面那段程式碼有什麼問題(考的是記憶體洩漏) 一面差不多就這些
二面: 二面繼續聊專案,華為比賽,自己教研室做的專案,(所以寫在簡歷上的任何專案一定要非常熟悉),然後就談談自己的職業規劃(感覺每個公司都會問的問題),為什麼想來華為?
3.58集團校招(拿到offer)    一面碰到個做演算法的,問了我很多數學知識,比如矩陣乘法有什麼實際含義,現場做了一個概率題,針對一個教研室的專案用了最優化方法,揪著我問共軛梯度的優點和缺點(所以自己寫上簡歷上的任何東西都得弄清楚,保不準就被問到了,我當時沒怎麼準備那個專案,以為沒哪個面試官會對教研的matlab專案感興趣);
二面問我網路方面的,TCP/IP協議(感覺是做後臺必問的一塊),由於沒做記錄,具體記不大清了。
4.百度內推(2面掛,都是電話面) 一面: (1)華為比賽的:要解決的問題是什麼?解決的方法是什麼?遇到最大的困難 (2)C++ static關鍵字的作用,儘可能多講它的應用場景 (3)C++的4個轉型動作分別是什麼?各自的作用    Const_cast<>移除常量特性後,是否會修改原變數的值?為什麼? (4)指標和引用的區別 (5)c++虛解構函式 (6)c++虛擬函式表的原理?(即要從編譯器的角度講多型的原理)    菱形繼承有什麼問題?如何避免? (7)聊一聊演算法,10億個數找第10大的。 (8)如何判斷連結串列是否有環? (9)看你做了網路方面的,下面聊一點網路方面的問題:          區域網軟體用了epoll,你當時為什麼要做epoll?(感覺自己面的幾個網際網路公司都對這個感興趣)         Tcp和udp的區別?(被問過很多遍的,要儘可能的多講)         Tcp中什麼時候會出現time_wait和close_wait狀態?         程序間通訊的方式有哪些?自己在什麼場景下使用過?
二面: 1.你做了很多個專案,講一個你認為影響最深刻的。(華為比賽)   1)先講一個這個比賽是關於什麼的,要解決什麼問題?   2)你們當時具體是怎麼做的,詳細的講一講。   3)求兩點的最短路用的是廣度優先還是深度優先?(詳細講了dijstra演算法的原理,屬於廣度優先) 2.你的專業是訊號的,為什麼又來做軟體開發相關的? 3.你做的區域網聊天軟體,是用什麼協議通訊的?(TCP)   為什麼要選用TCP? 4.是用的集中式伺服器還是分散式伺服器?   如果要將其拓展成分散式的伺服器,你會怎麼做?(不知道,對分散式不瞭解) 5.如何測試兩臺主機是否連通?(用ping)   Ping程式的原理是什麼?(ICMP報文)ICMP報文是在哪個層? ICMP報文有哪些潛在危險? 6.你平時做專案是在linux下開發還是windows下,對linux系統瞭解嗎? 7.如何要檢視一個伺服器的狀態,比如硬體的使用情況,程序數等? 8. 瞭解資料庫嗎?(用過MYSQL)    a.那你說說mysql的原理,客戶端有一個查詢,在資料庫中是如何執行的?    b.那查詢語句在資料庫中具體是怎麼執行的?怎麼找到對應符合條件的記錄?    c.那有了這個B+樹以後,馬上就能定位到符合條件的記錄嗎? 8. 對shell瞭解嗎? 9.有個100G的檔案,裡存的都是query,找出出現頻率最高的10個query   假設小檔案分得很小,能夠把多個檔案同時載入到記憶體,怎麼進行並行處理?(這樣的話,可以使用多執行緒)   那你是如何確定需要執行緒的數量的?是執行緒開得越多越好嗎,可以開啟執行緒的數量有上限嗎?那除了記憶體的限制還有其他的嗎?假設記憶體沒有限制,那執行緒是開得越多越好嗎? 10.資料結構這些課程應該上過吧? 11.差不多就這樣吧,你還有什麼問題問我嗎? 感覺這一面就一直在奪命連環問,這也是面試官很喜歡用的方式,考察我們對一個知識的掌握是否有一定深度
5.美團校招(3面掛) 由於沒做記錄,所以記得不大清楚了,留下的印象就是美團會問得很廣,基本把語言、作業系統、網路、設計模式都問一遍,並結合專案問得很細, 還有就是每一面都要寫程式碼(一面寫了兩個:大數相加,連結串列反轉;二面:寫一個迴圈佇列)
6.騰訊(從內推到校招,一路坎坷,最終拿到offer) 騰訊是面得最多的公司,一開始面的MIG內推,測試開發崗,掛在二面;然而又轉到SNG內推,視訊面完一面後莫名的成了TST內推,在深圳面了兩面,最後還是沒拿到offer;接著就是校招,面完三面,當時仍沒有收到offer(徹底心碎了 ,然後,12月底接到個電話,加面了一面,終於在元旦後發了offer
MIG內推一面: 1.簡單自我介紹一下,包括平時做的一些專案 2.區域網聊天軟體(注意,這也是我自己把面試官引導到我熟悉的領域 (1)tcp連線的建立過程,什麼時候發起連結,什麼時候connect返 (2)講一下tcp層和ip層的區別,它們各自分管的功能; (3)密碼安全方面的考慮,有什麼措施? (4) 第一次登入時儲存了密碼,下次登入時還要輸入密碼嗎?     如何識別別人冒充你登入到伺服器? (5)講一下epoll實現的原理; epoll和傳統伺服器的區別。 (6)做完這個東西有哪些心得體會,有什麼收穫? 3.C++的多型原理是什麼?編譯器上是怎樣實現的?多型和普通函式的重寫有什麼區別? 4.對設計模式是否瞭解?舉例常用的設計模式 5.檔案在硬碟上的組織形式是什麼?檔案在硬碟上的塊肯定不是連續的,那是怎樣找到這些塊的? 6.虛擬記憶體方面: 32位系統虛擬記憶體多大? 使用者程式及核心程式碼在虛擬記憶體上的佈局是怎樣的? 虛擬地址是怎樣對映到實體地址的? 7.平時有沒有用面向物件的思想做過東西?從物件的抽象開始。 8.平時做訊號處理演算法方面專案時,能不能用到面向物件的東西?你給我講一講用matlab做的東西,或許我們可以一起嘗試用面試物件的方式來實現?(鵝廠的面試官真的很nice,然而當我跟他講完平時用matlab做的東西時,他立馬就放棄了
MIG內推二面: 1.先簡單自我介紹一下; 2.選兩個你覺得體會比較深刻的專案講一下; 選的華為比賽專案   (1)當時是要解決什麼問題?   (2)用了哪些演算法?是自己實現的嗎?講一下dijkstra演算法的原理。。。。   (3)在提高成功率上你做了哪些改進;   (4)在團隊中,你的工作量在哪?發揮了什麼重要作用?   (5)比賽過程中你遇到的最大困難是什麼? 3.瞭解一些指令碼語言嗎?python,javascript,shell 3.平時寫程式時有沒有遇到過程式崩潰的情況? 當時做華為比賽時,遇到程式崩潰最多的是因為陣列越界。。。。 那有什麼方法避免陣列越界? 4.對多執行緒瞭解嗎? 5.對死鎖是否瞭解?如何避免死鎖?實現專案中有沒有遇到過死鎖的情況? 6.你是如何理解測試開發的? 7.你是偏向於測試還是偏向於開發? 8.給你一個網頁登入的程式,你會從哪些方面測試它? 9.你覺得自己的優勢有哪些? 10.你覺得自己有哪些缺點? 11.對html5有了解嗎? 12.你對自己未來的規劃是什麼? 13.你有什麼問題想問我?
MIG面掛後,不知道為什麼又把我推到SNG了,面完一面後,過了挺久沒抱希望了,突然收到電話叫我去深圳參加TST的內推面試:
SNG內推一面:(視訊面試) 1.先自我介紹 2.你說學習的方法是先看一些經典書,那你看了哪些書? 3.區域網聊天軟體是自己做的嗎,還是有這方面的專案? 4.問一個ping方面的問題,有沒有兩臺主機不能ping通,但可以建立tcp連線的情況? 有沒有能ping通情況下,但不能建立tcp連線的? 5.一臺主機在一個埠上可以建立多個連線嗎?可建立連線數有上限嗎?限制的因素有哪些? 6.你主要是在Linux下還是在windows下程式設計的?動態庫用過吧?動態庫的載入是在什麼時候的? 7.寫一個程式,求陣列中第k小的數(自己電腦上寫程式碼,面試官那邊能看到) 8.問一個非技術類問題:你需要把一些罪犯送到一個荒島上,於是你請了船長幫你來運這些罪犯,你需要支付一筆錢給船長,問題是,在運輸的過程,有些體弱或生病了的罪犯會  被船長扔到海里,你如何防止這樣的事情發生?即你的目的是要讓所有罪犯安全送到島上,你可以有什麼辦法?(至今不知道。。。。。)
大概過了2周後通知去深圳面試:
SNG深圳現場一面 一進去先讓我做兩個智力題,給40分鐘(其中一題有些思路,差不多做出來了,另一題沒任何思路),然後問了下我華為比賽的專案,怎麼實現的,自己做負責哪塊?
SNG深圳現場二面: hr面,聊聊自己的性格、愛好、家族情況、優缺點,騰訊的hr還是很nice的,整個面試氣氛比較輕鬆。
面完看著小夥伴們都收到offer了,最後又沒有我,傷心。。。。。 然後就等到 騰訊校招了,最後一次機會。。。。。
騰訊校招一面: 1.你先簡單自我介紹下吧(介紹時面試官在看我簡歷) 2.作業系統,對程序的理解 3.那一個程序有哪些資源 4.程序間的通訊方式 5.有沒有想過程序間的通訊方式在作業系統裡是怎麼實現的? (我就以共享記憶體為例,說大概是跟虛擬記憶體對映為實體記憶體的機制差不多) 6.那你說說虛擬記憶體是怎麼對映到實體記憶體的? 7.執行緒間的通訊方式有哪些? 扯到讀寫鎖 就問我讀寫鎖方面的 8.對作業系統還知道哪些?(Linux下的檔案系統,io這些) 9.看我專案裡有epoll,問我epoll的原理 10.找連結串列倒數第k個點(說了下快慢指標的方法) 還有什麼方法?(想了半分鐘,說可以用遞迴的方式,然後跟他解釋了下,但沒說清楚,就叫我寫一下程式碼) 但最後程式碼也沒完全寫對,當時腦子卡殼了,其實挺簡單的, (這也是一面最遺憾的地方,但幸好面試官說,你能想到幾種方法,已經可以了) 差不多了,今天的面試就到這吧,回去等通知
騰訊校招二面: 1.先自我介紹 2.你是訊號專業的,有上過基本的計算機課程嗎? 3.對作業系統瞭解吧 4.Linux你學過什麼?(主要是linux下系統程式設計方面的,還有一些作業系統方面的概念,如程序,執行緒,linuxIO這些) 5.那你講講執行緒與程序的區別?   為什麼執行緒的切換速度快? 6.那一個程序的記憶體佈局是怎樣的? 8.程序間的通訊方式有哪些? ( ……….)    10.為什麼共享記憶體是最快的IPC?(把共享記憶體和訊號佇列的實現上對比了一下)   反問AB兩個程序訪問共享記憶體不會有什麼問題嗎?(說需要有同步)   接下來就問我訊號量,說訊號量的原理,怎麼使用訊號量 11.對網路程式設計方面的知道嗎?(知道一些,主要是tcpip協議及socket API這些) 12.tcp udp有什麼區別? 13.那tcp是怎麼實現流量控制的?(滑動視窗+擁塞視窗) 14.你剛才說到tcp在傳輸層加了很多東西,所以比較慢,那具體有哪些,怎樣導致它比udp更慢? 15.畫一下TCP的狀態轉換圖 16.對網路程式設計方面的IO操作有了解嗎,說說阻塞IO和非阻塞IO的區別? 17.什麼是非同步IO,非同步IO完成後有什麼通知程序的方式?(說到有訊號驅動的IO,還說到epoll) 18.你專案中也用到了epoll,你能說說epoll的原理嗎,以及和select,poll的區別? 19.資料結構演算法也熟吧(說了一些常用的資料結構,和一些排序演算法) 20.查詢演算法有哪些?(說了常用的是二分查詢) 21.那寫一個二分查詢的程式吧,要以能在電腦上執行的標準來寫 (寫完後,他一看是遞迴的,就說你怎麼用遞迴寫,你知道遞迴有什麼缺點嗎? 當時有點緊張了,趕緊說了下遞迴的缺點,然後強調說我也可以寫迴圈的 接著就讓我寫迴圈的了) 22.看完後,緊接叫我寫單鏈表反轉的程式碼 23.對c++掌握的怎麼樣?建構函式和解構函式的作用,為什麼需要它們? (期間扯到了物件的分配,new和malloc有什麼區別) 20.能說說你對多型的理解嗎? 21.你學的是c/c++語言,你對語言是怎麼看待的? 22.你想做的方向是什麼?(linux下的服務端開發) 23.我這裡沒有問題了,你有什麼問題問我的?(就問了下面試官是哪個事業群的)
騰訊校招三面(HR面) 1.先自我介紹 3.說我之前內推面試過,看到我應聘的測試開發,問我為什麼,問我內推為什麼掛了。 4.這些內推面試之後到現在這段時間內,有沒有總結,然後去改進? 5.說一個你最近覺得做得最成功的專案(華為比賽)                     6.具體是怎麼做的,自己承擔了哪些工作 7.當時遇到的最大困難是什麼? 8.在這個比賽的過程中隊員之間有沒有產生過分歧 9.你是怎樣自學的,如何知道自己要學什麼? 10.你有什麼優缺點? 11.進入公司後,你希望從這個崗位上收穫什麼? 12.面過哪些公司? 13.說到華為有找學校拿三方的情況,問我是否瞭解,華為是不是跟你電關係很好? 14.問我有什麼問題問她?(問完後,還跟我聊了挺多的,感覺面試官很nice)
整體校招面下來感覺還不錯,以為問題不大了,然而還是沒有收到offer,當時也就徹底放棄了騰訊,安心去華為,跟華為簽了。 But。。。。12月底又突然接到hr電話,問我還有沒有意向去?(趕緊強調自己想去),然後就又面了10幾分鐘,等通知,終於在元旦節後收到offer,總結下來騰訊從內推到校  招,總共面了有9次(兩個部門),也是醉了,最終收到offer,感覺挺幸運的,接下來又要開始漫長的毀約之路了(學校今年卡得嚴),希望自己最終能去騰訊!
我把每次面試問了哪些問題都講得很詳細,希望對之後準備校招的有一定參考意義吧!也給自己贊點人品