0.前言git
以前寫了一些具體知識點的相關文章,本次聊聊面試實戰。程序員
面試是爲了查漏補缺、明確學習方向和斬獲offer,因此寫一些本身以及好朋友們遇到過的面試題、以及我的對面試的一些見解。
題目主要來自百度、阿里、騰訊、微博、搜狗、FunPlus、高德、滴滴、快手、曠視、360、迅雷、獵豹、TME等公司。面試
因爲時間緣由作到100%完整描述不太可能,可是基本上也都達意了,有必定的參考價值。算法
1.修煉心法數據庫
不打無準備之仗編程
知己知彼百戰不殆,面試以前須要在拉勾、BOSS直聘上大體瞭解一下招聘崗位的工做描述,不排除一些公司虛張聲勢寫些個根本用不着的玩意,因此若是以爲崗位對口卻匹配度低,也沒必要緊張試試再說。
內推是瞭解崗位要求的重要渠道,不過從經驗看若是不是內推人本組的招聘崗位,很難作到深刻細緻的瞭解,總起來講這樣的內推和在線投遞差異並不太大,不要覺得內推就穩了,不然筆者內推獎金早拿到手軟了。設計模式
另外相同崗位不一樣級別考察的側重點也有很大區別,所以要根據意向崗位級別在深度和廣度上進行差別化準備。數組
面試官什麼路子緩存
一百場面試就有一百種側重點,但並不能都算得上高質量的面試,知乎上有關於高質量面試的話題,感興趣能夠看看。安全
做爲主導者的面試官,我的認爲最重要的原則是:明確在招崗位的職責內容,並以此爲出發點對候選人進行考察,通常來講候選人過往經歷和在招崗位很類似的狀況比較少,在此狀況下就要從候選人的基礎是否紮實、學習能力如何等方面來衡量候選人快速適應新崗位內容的能力。
舉個例子:"並不必定要把1TB的硬盤裝滿才能證實這個硬盤是1TB的"
所以不少時候面試就像是一場證實500GB硬盤具有1TB空間的過程,至於測試手段是否科學就是面試官須要拿捏的了,若是面試官都不清楚本身問這個問題到底是爲了考察什麼,那麼這就是一場低質量的面試,因此對於候選人來講成敗與否都不用在乎,畢竟這種糊塗面試官若是之後做爲同事也是件很糟糕的事情。
作個合格的面試者
候選人沒法左右面試官的問題,可是對於非大神面試者仍是要作到幾點,來提升面試成功率,包括但不限於:
珍惜機會切忌裸面
毫無準備地去面試既浪費本身的時間也浪費面試官的時間,任何事情都有機會成本,重要的是如今大廠都有本身的人才庫體系,若是一年半載後再投,上次裸面的評價都依然還在,新的面試官對候選人的印象會大打折扣,甚至不給面試機會,因此要珍惜面試機會,裸面的面試者並很多見,問幾個問題就GameOver了,場面也十分尷尬。
理清思路清晰表達
在面試官表述了問題以後,就算問題在射程範圍內也不要急於回答,先理清楚條件,若有疑問當即求證,肯定問題全部條件再作解答。在筆者做爲面試官時比較看重這一點,由於這種性格在工做中是很是難得的,不少時候你會遇到不少模糊需求,若是不反覆肯定就按照你覺得的開幹,只能是緣木求魚,最終delay掉需求。
拓展思惟勇敢做答
對於大部分面試者來講,遇到沒見過的題目也沒必要慌張要冷靜分析當前問題中的難點,進而結合本身的實際經驗和知識儲備來提出你的分析和解決方案,縱然短期內很難提出最優方案,或許能夠很接近答案了,可是也不要胡說,不然只能讓人以爲你膽大心更大,具有刪庫跑路的潛力。
相信本身信心滿滿
時常出現面試者去二三線廠面試,最後給的評價很低,徹底與其本人技術實力不匹配,以後短期內反手拿了BAT的offer,因此任什麼時候候都不要妄自菲薄,要無條件相信本身。我對此深有體會,筆者本碩都非CS專業且有必定跨度,遙想當年校招隔壁實驗室一塊兒打球的CS碩們收割大廠offer,我這邊就算小公司也會被鄙視一通,因此不管現境如何,堅決信念、找準方向、持續發力、總會有所斬獲。
2.實戰題目
因爲筆者以及好朋友們大都是Linux C/C++/Python/Go技術棧,因此實戰題目也是圍繞這個技術棧展開的,其餘語言棧的大神能夠選擇性閱讀無語言差別的共性問題,好比MySQL、Redis、Linux系統等。
題目分類
Linux C/C++技術棧的題目通常包括但不限於如下幾大類:
編程語言
數據結構和算法
數據庫存儲
Linux系統
開源組件
工程設計
題目彙總
按照上面分類來概括一些大廠的問題,更能看到各個分類下的熱門問題,從而更好地把握面試方向。
編程語言
闡述如何設計一個C++類?實現String類。
談談對C++虛函數機制的理解。
STL的Vector原理及迭代器失效的理解。
設計一個C++HashMap類。
使用C++實現一個堆的模板類。
寫一個宏定義比較函數並解釋宏展開過程。
談談std::move的理解和使用。
malloc的內存能夠用delete釋放嗎?緣由?
簡述C++11的新特性以及解決了什麼問題。
STL的Map原理、插入和刪除複雜度分析。
STL的Map基於紅黑樹實現的緣由,爲何不選擇哈希表?
爲何須要虛析構?虛析構和普通析構函數的區別是什麼?
說明C++對象的內存佈局模型。
聊聊C++臨時對象和右值引用,寫個例子。
使用C++寫一個高效的多維矩陣乘法。
談談對智能指針的認識並實現一個智能指針類。
STL中Map的查找時[]和find區別是什麼?哪一個更快?
實現memcpy函數效率儘量高。
嘗試實現C/C++中經常使用字符串庫函數。
談談C++中強制類型轉換的原理和使用,寫個例子。
談談C++的設計模式,重點介紹下單例模式、工程模式等。
數據結構和算法
求二叉樹節點和爲N的全部路徑。
實現二叉樹的鏡像。
實現兩棵二叉樹相加生成一棵新的二叉樹。
實現單鏈表的遞歸逆置和非遞歸逆置。
二分查找變種問題。
二叉樹的後序非遞歸遍歷。
兩個無序整型數組交換元素使得兩數組和差距最小。
給定整型數組和目標數輸出數組全部兩數之和爲目標數的組合。
找到帶權重二叉樹中從根到葉子的最大和路徑。
最長公共子序列LCS問題。
二叉樹中找到指定兩個節點最近公共祖先。
實現堆排序求Top10數據。
實現最小棧。
簡述並嘗試設計一個布隆過濾器。
外排序的基本實現過程。
常見排序算法的性能對比。
快速排序的非遞歸實現
注:關於數據結構和算法的網站和書籍很是多,而且這個分類也是面試中變幻最大的,這裏就不展開了。
對於數據結構和算法能力的切實提升,能夠刷LeetCode、《算法導論》、《編程之法》、《編程珠璣》、《程序員面試金典》(注意不是寶典)、《程序員代碼面試指南》等書籍,不少公衆號或者書籍的做用是對知識點進行梳理概括總結,沒有捷徑,只有本身動手多練多寫才能真正成爲本身的硬實力。
筆者認爲雖然數據結構和算法的題目比較繁雜,可是掌握常見數據結構(數組、鏈表、棧、隊列、樹等)的基本特性和實現方法,再結合二分、遞歸、回溯、貪心、動態規劃等算法思想,不少問題均可以回答得比較接近正確答案,數據結構作骨架、算法是靈魂,務必多練多寫找到感受。
堅持天天刷leetcode是個好辦法,可是對於在職人員來講996已經快被搞死了,LeetCode每日一題確實有些困難,何況刷LeetCode的重點在於一題N解,多個角度多種方法解題,不過仍是那句話:"種一棵樹的最好時間是十年前,然後是如今"。
數據庫存儲
談談對於Redis的底層數據結構的理解。
跳錶瞭解嗎?Redis的zset實現原理以及爲何不用紅黑樹。
Redis哨兵原理以及集羣版故障轉移過程。
基於Redis實現分佈式鎖。
Redis漸進式Rehash的實現原理。
Redis和LevelDB的區別以及LevelDB的LSM樹和WAL原理。
Redis主從同步的實現原理和過程、產生數據丟失的緣由。
MyISAM和InnoDB的區別。
MySQL索引原理和優化。
Redis集羣版如何實現一致性Hash算法的。
Redis的單線程網絡框架原理和混合持久化機制。
類Redis數據庫Pika瞭解嗎?基本設計架構是什麼?
如何設計一個緩存系統以及緩存擊穿的解決方案?
一致性協議raft/paxos/2pc/3pc基本原理。
Redis的Gossip協議原理。
Redis4.0+版本的BIO線程原理和使用。
簡述如何本身實現一個NoSQL,須要考慮什麼。
Linux系統
LVS實現負載均衡的原理。
簡述Linux內存管理原理以及夥伴算法和Slab算法。
select和epoll的對比以及epoll實現的底層原理和數據結構。
epoll的LT模式和ET模式下讀寫操做,實現一下ET模式的read/write。
使用C++簡單實現一個生產者消費者模型。
Linux虛擬內存和物理內存的區別與聯繫
如何使用gdb調試多進程、多線程程序。
談談C10K和C10M問題及大體實現思路。
Linux地址複用和端口複用的使用。
談談Reactor和Proactor模式區別與聯繫。
嘗試基於epoll實現一個高併發網絡框架。
Nginx的基本原理以及負載均衡實現方法。
談談Linux服務器內存/cpu/磁盤/網絡帶寬的監控命令和問題排查。
談談CAP理論以及分佈式一致性算法。
瞭解CpuCache嗎,如何據此來優化代碼。
讀寫鎖、RCU鎖、自旋鎖的對比以及設計讀優先/寫優先的讀寫鎖
本身設計實現一個簡單的讀寫鎖。
談談grpc的使用以及brpc的對比。
對比協程和進線程,重點說明系統開銷差別和各自優缺點。
談談對線程同步和多線程安全的理解。
Https的C/S交互過程、http1.0/2.0/3.0的對比。
多進程通訊的方法和對比。
多線程同步的實現和線程安全。
實現一個基於LRU的本地緩存。
TCP/IP的擁塞控制原理和缺陷、BBR算法對比。
使用Python實現多進程和多線程以及談談對GIL的理解。
網絡攻擊有哪些?簡述DDos、CC攻擊。
對比內存分配malloc/tcmalloc/ptmalloc。
Protobuf協議的簡單原理和使用。
Coredump的常見緣由。
死鎖的原理以及寫一個死鎖。
MapReduce的基本原理、寫個簡單的map和reduce的程序。
同步異步阻塞非阻塞IO的理解。
git的基本原理以及經常使用命令。
局部性hash算法simhash的原理。
服務端長短鏈接的區別、優點和場景。
如何避免多線程的虛假喚醒問題。
實現簡單的線程池和鏈接池。
實現一個能夠完成C10K+的TCP網絡框架。
嘗試多種方法實現一個守護進程,2 magic fork瞭解嗎?
驚羣問題知道嗎?Nginx是如何解決的?
談談對服務治理和服務發現的理解。
微服務接觸過嗎?談談對微服務的理解。
服務異步化編程瞭解過嗎?
開源組件
經常使用的MQ有哪些以及各自的對比和場景
Kafka的基本原理和實現要點
libevent/libuv的基本原理和使用
Boost.Asio的原理和使用
微信協程庫libco原理和使用
DPDK的基本原理和用戶態協議棧的概念
Redis和Memcached對比
RPC框架對比:brpc/grpc/thrift
STL源碼的理解和閱讀分析
Nginx的架構、原理、使用
注:開源組件的問題通常都比較寬泛,所以沒有列舉太多具體問題。
開源組件的準備重在基本原理和架構的理解,面試官不但願候選人對開源組件的使用是徹底的拿來主義和黑盒子式API調用,其次是從開源組件中得到解決問題的思想和套路。
由於平常工做場景有不少共性問題,能夠借鑑開源組件的經驗進行遷移解決,都是要站在巨人的肩膀上的,牛頓都站了,你何須要閉門造車呢?
工程設計
信息流推薦中會生成大量點擊率文章,設計一個程序實現即時排序,返回熱門文章。
詞庫每一個詞都有根據點擊率來計算的熱度,實現一個系統,支持前綴匹配而且返回Top10的熱詞。
設計一個支持千萬級文章類似度去重的程序,來實現抄襲、洗稿文章的識別,時間ms級,準確率不低於95%。
小內存機器有兩個文件A和B,分別存放5億條均長64字節的url,試着找到A和B中全部重複的url。
嘗試實現一個簡單的音樂推薦系統,能夠不涉及具體算法,主要說明工程部分便可。
設計一個黑詞服務實現黃反、指令詞、敏感詞等過濾功能,耗時ms級。
工程設計題目通常會是面試官平常遇到的典型問題,類型不少,可是系統設計類問題常常和海量數據問題、堆排序等一塊兒出現。
對於此類問題,重要的是明確功能點、找準解題方向、拆解子問題、分步驟合併、各個擊破、先實現再提優化方案,以此原則來解決工程設計問題,基本上就很接近答案了。
3.小結和感慨
題目不少而且沒有給出解答,除了工程設計題,其餘題目在網上均可以找到解答,可是本號會在後續文章中對上述問題各個擊破,創建完整分類的體系,敬請期待。
2018下半年以及整個2019一直被認爲是寒冬時期,也總能聽到裁人或者公司倒閉的一些消息,有校招生比offer也有剛畢業的應屆生被裁,有套現離場的也有昨天還在熬夜加班優化代碼,第二天被裁的,還有甚囂塵上的35歲失業問題,林林總總。
不管如何做爲求職者和在職者都要坦然面對,市場波動在所不免,咱們能作的只有:擁抱變化 時刻準備着。