学习笔记之与 30 家公司过招,得到了这章面试心法
與 30 家公司過招,得到了這章面試心法 - 算法與數(shù)據(jù)結(jié)構(gòu)
- https://mp.weixin.qq.com/s/Ml5RdaK4KMSZMctWko7wwA
總結(jié)下來,技術面試大致有三種情形,下邊一一來講講。
一、考察數(shù)據(jù)結(jié)構(gòu)和算法為主
IT 公司一般都會考察數(shù)據(jù)結(jié)構(gòu)和算法能力,其中以百度與愛奇藝等為代表,面試官一般是先簡單地了解你之前的工作經(jīng)歷和項目經(jīng)驗,然后就直接出算法和數(shù)據(jù)結(jié)構(gòu)的題目,具體涉及到以下內(nèi)容:
-
快速排序。考察的地方包括算法步驟、平均算法復雜度、最好和最壞的情形,有人說校招要把算法寫出來,我這里是社招,所以一般描述一下算法過程即可。
-
二分查找法。一般面試官會要求面試者把算法寫出來,或者先結(jié)合一個具體場景來提問,需要你聯(lián)想到要使用該算法,比如求一個數(shù)的平方根,接著要你把它具體實現(xiàn)。
-
鏈表。常見的面試題有要求你寫出從一個鏈表中刪除一個節(jié)點的算法、單鏈表倒轉(zhuǎn)、兩個鏈表找相交的部分等,一般需要完全無誤地寫出來。
-
實現(xiàn)一些基礎的函數(shù)。例如 strcpy、memcpy、memmov 與 atoi 這些函數(shù),面試官會要求你用自己的理解和思路去實現(xiàn)。同樣,這些一般也需要完全無誤地寫出來,并且要保證高效,比如你的實現(xiàn)中有動態(tài)分配堆內(nèi)存,那么這道題目就算答錯。
鏈表和實現(xiàn)基礎函數(shù)的關鍵點一般在于考察你的代碼風格、對邊界條件的處理,比如判斷指針是否為空,千萬不要故意不考慮這種情形,即使你知道也不行,只要你不寫,一般面試官就認為你的思路不周詳,容錯率低;再比如,單鏈表的倒轉(zhuǎn),最后的返回值肯定是倒轉(zhuǎn)后的鏈表頭結(jié)點,這樣才能引用一個鏈表,這些都是面試官想考慮的重點。
-
哈希表。對哈希表的細節(jié)要求很高,比如哈希表的沖突檢測、哈希函數(shù)常用實現(xiàn)、算法復雜度;比如百度二面就讓我寫一個哈希表插入元素算法,元素類型是任意類型。
-
AVL 樹與?B 樹。考察概念與細節(jié),比如會問 MySQL 數(shù)據(jù)庫索引的實現(xiàn)原理,基本上就等于在問你 B 樹。?
-
紅黑樹。這個基本上是必問的數(shù)據(jù)結(jié)構(gòu),包括紅黑樹的概念、平均算法復雜度、最好最壞情況下的算法復雜度、左右旋轉(zhuǎn)與顏色變換。面試官常見的套路有:你熟悉 C++ 的 stl 嗎?你說熟悉,ok,stl 的 map 用過吧?用過,ok,那 map 是如何實現(xiàn)的?紅黑樹,ok,那什么是紅黑樹?這樣提問,紅黑樹就開始了。Java 的也類似。
二、考察操作系統(tǒng)原理等基礎技術
這一種以餓了么、bilibli、喜馬拉雅、360 與攜程等為代表,主要兼顧算法與數(shù)據(jù)結(jié)構(gòu),但重點放在其它開發(fā)技術,比如操作系統(tǒng)原理、網(wǎng)絡協(xié)議細節(jié)與具體的開發(fā)庫源碼等內(nèi)容。
基礎的 C++ 問題
以 C++ 語言為例,這一類常見的問題有:
-
C++ 的繼承體系中 virtual 關鍵字的作用,如繼承關系中析構(gòu)函數(shù)為什么要申明成 virtual 函數(shù),如果不申明為 virtual 會有什么影響、再涉及到父子類時構(gòu)造與析構(gòu)函數(shù)的執(zhí)行順序、多重繼承時類的成員列表在地址空間的排列;
-
static 關鍵字的作用,static_cast、reinterpret_cast 與 dynamic_cast 等幾個轉(zhuǎn)換符的使用場景;
-
問得最多的就是虛表的布局,尤其是菱形繼承,即 B 和 C 繼承 A,D 繼承 B 和 C,每個對象的空間結(jié)構(gòu)分布,比如問 D?有幾份虛表,D 中 B 和 C 的成員空間排布。
另外,如果你應聘的職位使用 C++ 開發(fā),很多公司會問你一些 C++ 11 的東西,或者問 boost 庫,基本上都一樣。這個你用過就用過,沒有用過就說沒用過不要裝 X,常見的 C++ 11 需要掌握的一些技術庫我也列舉一下吧:
-
auto 關鍵字
-
for-each 循環(huán)
-
右值及移動構(gòu)造函數(shù)
-
std::forward、std::move
-
stl 容器新增的 emplace_back() 方法、std::thread 庫、std::chrono 庫
-
智能指針系列 std::shared_ptr、std::unique_ptr、std::weak_ptr,智能指針的實現(xiàn)原理一定要知道,最好是自己實現(xiàn)過
-
線程庫 std::thread
-
線程同步技術庫 std::mutex、std::condition_variable、std::lock_guard 等
-
lamda 表達式(Java 中現(xiàn)在也常常考察 lamda 表達式的作用)
-
std::bind、std::function 庫
網(wǎng)絡通信問題
考察對網(wǎng)絡協(xié)議的理解和掌握程序,比如 TCP/IP 協(xié)議棧的層級關系,三次握手和四次揮手的細節(jié),注意我說的是細節(jié),比如 CLOSE_WAIT 和 TIME_WAIT 狀態(tài)。bilibili 問了這樣一個問題,你可以感受一下:
A 與 B 建立了正常連接后,從未相互發(fā)過數(shù)據(jù),這個時候 B 突然機器重啟,問 A 此時處于 TCP 什么狀態(tài)?如何消除服務器程序中的這個狀態(tài)?
再羅列其它一些常見問題:
-
萬得問過流量擁塞和控制機制
-
騰訊問過 TCP 和 IP 包頭常見字段有哪些
-
東方財富網(wǎng)問了阻塞和非阻塞 socket 在 send、recv 函數(shù)上的行為表現(xiàn)
-
異步 connect 函數(shù)的寫法
-
select 函數(shù)的用法
-
epoll 與 select 的區(qū)別,基本上只要問到 epoll,必問 epoll 的水平模式和邊緣模式的區(qū)別
-
一些 socket 選項的用法,nagle、keepalive、linger 等選項的區(qū)別
-
TCP 與 UDP 的區(qū)別和適用場景
-
通信協(xié)議如何設計避免粘包
-
HTTP 協(xié)議的 get 和 post 方法的區(qū)別,問得比較深的會讓你畫出 HTTP 協(xié)議的格式
-
可能會問到 Windows 完成端口模型(IOCP)
總之,網(wǎng)絡通信問題能搞得多清楚就搞多清楚,最起碼把 TCP 應用層各種 socket API 的用法細節(jié)搞清楚。
操作系統(tǒng)原理
上海黃金交易所和喜馬拉雅聽書都問了 Linux 下 elf 文件的節(jié)結(jié)構(gòu),映射到進程地址空間后,分別對應哪些段。相關的問題還有全局變量、靜態(tài)存儲在進程地址空間的哪里。餓了么二面問了操作系統(tǒng)的保護模式實模式、中斷向量表、Linux 下的 CAS。Linux 系統(tǒng)下可能還會問什么是 daemon 進程,如何產(chǎn)生 daemo 進程,什么是僵尸進程,僵尸進程如何產(chǎn)生和消除。
堆和棧的區(qū)別,棧的結(jié)構(gòu)、棧的細節(jié)一點要搞得特別清楚,因為一些對技術要求比較高的公司會問得比較深入,例如京東的一面是讓我先寫一個從 1 加到 100 的求和函數(shù),然后讓我寫出這個函數(shù)的匯編代碼,Java 開發(fā)的同學可能會讓你試著去寫一點 JVM 的指令。如果你對棧的結(jié)構(gòu),如函數(shù)參數(shù)入棧順序、函數(shù)局部變量在棧中的布局、棧幀指針和棧頂指針位置不熟悉的話,這題目就無法答對了。
棧的問題,可能會以常見的函數(shù)調(diào)用方式來提問,常見的有?__cdecl、__stdcall、__thiscall、__fastcall 的區(qū)別,比如像 printf 這樣具有不定參數(shù)的函數(shù)為什么不能使用 __stdcall。
此外還有進程和線程的聯(lián)系與區(qū)別,問得最多的就是線程之間的一些同步技術,如互斥體、信號量、條件變量等,Windows 上還有事件、臨界區(qū)等,這類問題還可以引申為什么是死鎖、如何避免死鎖。這些東西你必須熟悉到具體的 API 函數(shù)使用的層面上來。這是實際開發(fā)工作中編碼最常用的東西,如果你連這個都不能熟練使用,那么你多半不是一個合格的開發(fā)者。
進程之間通信的常用技術也需要掌握,Linux 常用的通信方式有共享內(nèi)存、匿名和具名管道、socket、消息隊列等等,管道和 socket 是兩個必須深入掌握的考察點。
使用過的開源技術
考察使用過的開源技術,比如 Redis 與 MySQL 等項目。開源技術的使用一般不做硬性要求,但是這里必須強調(diào)一下 Redis,熟練使用 Redis 甚至研究過 Redis 源碼,現(xiàn)在一般是對做后臺開發(fā)的技術硬性要求。
基于 Redis 的面試題既可以聊算法與數(shù)據(jù)結(jié)構(gòu),也可以聊網(wǎng)絡框架等東西。我面試的公司中基本上百分之九十以上都問到了 Redis,只是深淺不一而已,比如喜馬拉雅問了 Redis 的數(shù)據(jù)存儲結(jié)構(gòu)、rehash,bilibili 問了 Redis 的事務與集群。
三、考察項目經(jīng)驗
只問一些做過的業(yè)務或者項目經(jīng)驗,這類公司他們招人其實對技術要求不高,除非是資深及主管級開發(fā)。只要你過往的項目與當前應聘職位匹配,可以過來直接上手干活就可以了,當然薪資也就不會給很多。比如游戲公司會關心你是否有某某類型的游戲開發(fā)經(jīng)驗、股票類公司會關心你是否有過證券或者交易系統(tǒng)的開發(fā)經(jīng)驗等。
業(yè)務開發(fā)哪里都能找到,真正重視技術的公司,應該是廣大做技術尤其是初中級開發(fā)的朋友更為關注的。
轉(zhuǎn)載于:https://www.cnblogs.com/pegasus923/p/10400416.html
總結(jié)
以上是生活随笔為你收集整理的学习笔记之与 30 家公司过招,得到了这章面试心法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刷前端面经笔记(十二)
- 下一篇: day22 Pythonpython 本