騰訊互娛C++面經(兩輪技術+一輪HR)


作者:fm
鏈接:https://www.nowcoder.com/discuss/77044?type=0&order=3&pos=492&page=1
來源:牛客網

前些天完成了騰訊互娛的面試,時間大概一周左右,不得不說騰訊的效率還是挺高的,不過面試流程有些詭異。
樓主之前內推的WXG,結果一面GG,正式實習招聘被IEG撈了起來,前兩輪都是深圳的電話面試,HR面在武漢現場。崗位是后台開發。
總的來講,面試體驗還是非常好的,面試官水准很高。
一面:
一面直接從做的東西開始聊,中間穿插着問了很多C++內容,計算機網絡一點沒問(我提到自己沒有寫過后台的東西),算法沒問。
Q:你的這個游戲,自己做的核心內容是什么。
A:我自己實現了怪物AI的有限狀態機,后面又使用行為樹進行了重寫,尋路算法部分,我這一塊用的是自己寫的A*算法。
Q:A*算法是自己寫的對吧,具體怎么實現的。
A:我使用哈希表作為地圖的基本結構,openlist和closelist都采用的這種數據結構,啟發式部分,使用的是最簡單的曼哈頓距離作為啟發式第二項的值,第一項的值就是根據parent結點進行更新的距離起點的值。
Q:有沒有比較過自己的實現和其它實現,具體的區別在哪里。
A:這個有比較過,我感覺最大的區別之處就在於兩個點的處理,第一個點,openlist的插入,我的實現是哈希表,所以插入是O(1)的,對方維護的openlist是一個有序數組,插入是二分查找,是O(logN)(這里實際上答錯了,后面追問的時候更正了),第二個點,找出openlist里啟發式值最小的結點,我的方法需要遍歷所有點,因此是O(N),而對方因為是有序數組,只需要取第一個結點就可以了,因此是O(1)。
Q:如果維護的是一個有序數組的話,那插入一定會有數組部分的后移,還會是O(logN)嗎?如果取第一個結點,那么刪除之后,也會有移動。(這里面試官真的非常好,點出你的錯誤,讓你有挽回空間)
A:我上面的答案有錯誤,數組也可以是一個最小堆,對方的寫法應該是最小堆,插入是O(logN),刪除也是O(logN)。
Q:嗯,如果是最小堆,那兩種方法的效率對比?
A:這個要看具體的情況,需要實驗性的評估,因為不能夠確認兩者的具體時間消耗對比。
Q:最小堆的話,刪除是怎么做的?
A:刪除最小堆頂的元素后,把堆末尾的元素放到堆頂,與其余兩個元素比較,進行下沉操作,因此復雜度是O(logN)。
Q: C++的兩種map?
A:unordered_map和map。前者是哈希表實現,后者是紅黑樹。
Q:紅黑樹的性質?
A:5個性質
Q:紅黑樹和AVL樹相比呢,優勢在哪里?
A:兩者都是特殊的BST,相比AVL,紅黑樹不要求嚴格的1的高度差,對於插入操作,兩個樹類似,最多旋轉兩次,對於刪除,紅黑樹最多旋轉3次,而AVL樹則是O(logN)。
Q:那紅黑樹的高度差最多?
A:2.(這個問題其實很簡單,但自己蠢了,半天沒答上來,原因就是高度兩倍的性質,因此高度差最多2)
Q:問一些C++的內容。sizeof空類的值?
A:不包含虛函數就是1,包含虛函數4或8(虛表指針,32位4,64位8)。
Q:C++多態?
A:這個問題已經重了,答到虛函數表就OK。
Q:多重繼承下的內存結構?
A:簡單來講,多重繼承的子類本身會有多個虛表指針,分別指向多個不同父類的虛表。如果有新的虛函數定義,則會在第一個虛表的末尾增加新的函數地址。(這里慶幸沒問菱形繼承,這個是真的不懂)。
Q;C++ 11的新特性了解嗎,講一些。
A:最常用的是自動類型推導,其實跟模板類型推導類似,右值引用,lambda表達式,智能指針等。
Q:講講智能指針吧。
A:三種智能指針, shared,unique,weak
Q:shared的原理?
A:shared維護了一個指向control block的指針,control block內部包含了智能指針對象的引用個數。
Q:避免死鎖?
A: weak
Q:weak_ptr原理?
A:weak count, weak count是弱引用的個數,弱引用個數不影響shared count和對象本身,shared count為0時則直接銷毀。
Q:如何判斷weak_ptr的對象是否失效?
A:我個人認為應該使用的函數是lock(),lock會返回shared指針,判斷該指針是否為空。use_count()也可以得到shared引用的個數,但是速度較慢。
Q:shared和unique區別?
A:unique具有唯一性,對指向的對象只存在唯一的unique_ptr. unique_ptr不可復制,賦值,局部變量的返回值除外。與shared_ptr相比,若自定義刪除器,需要在聲明處指定刪除器類型,而shared不需要,shared自定義刪除器只需要指定刪除器對象即可,在賦值時,可以隨意賦值,刪除器對象也會被賦值給新對象。
Q:原因是什么?
A:unique的實現中,刪除器對象是作為unique_ptr的一部分,而shared_ptr,刪除器對象保存在control block中。
C++的部分大概就問到這里了,接下來15分鍾就是問研究的東西。之后的一個沒答好的問題,面試官問,多線程和多進程比,為什么消耗更小,假設他們的調度策略類似。
A:這個問題真的沒答好,當時的回答是,線程切換時,需要保存的信息更少,而進程切換時,換頁過程,重新從磁盤將進程換入內存的過程都很耗時,進程間的通信也更加復雜。
最后面試官的意思是,要多准備一些關於並發的內容,如果從事后台的話。
二面:
二面非常短,大概15分鍾結束,面試官應該是項目總監,沒有問具體問題,就是簡單問了下項目,然后具體探討了要做什么的問題,因為我自己的想法是從事C++相關的開發,然而並沒有后台經驗,可能面試官對於這一點還是有疑慮,最后說的是可以先過來寫后台,如果不合適再轉到前端。(大概了解到是用Unity,我個人不喜歡這個引擎)
HR面:
一些常見的問題,遇到的最大挫折之類,對游戲沉迷的看法,玩過哪些游戲,怎么看待騰訊游戲的負面等等。最后問到offer情況,我提到已經拒了螞蟻,手上有網易互娛,之后的問題就是比較一下這倆公司。然后大概的后續就是說騰訊的企業文化更加開放包容之類,希望能夠來騰訊實習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM