前言
前幾天因爲工做的緣由一直沒怎麼看私信,昨天在整理私信的時候看到了一個粉絲給我瘋狂私信想要我幫忙整理一份大廠面經,說本身工做也有幾年了想跳槽衝刺一下,可是不知道該怎麼作好前期準備。我看到這個粉絲也是挺執着的,一直在給我私信,也是花了兩天時間把以前幾個朋友的跳槽面試經歷和經驗整理了一下,具體乾貨都給你們放在下面了!mysql
準備
敲定了方向和目標後就開始系統準備,主要分爲如下幾個方面來準備。linux
算法題
事先已經看過別人的社招面經知道頭條每輪技術面都有算法題,而這一塊平時練習的比較少,校招時刷的題也忘記了不少。所以系統複習的時候算法題仍是花了比較多時間的。先是快速刷完了劍指 offer,這個校招時已經刷過兩邊了,所以如今刷起來會相對快一些。而後就是啃 LeetCode 的題了,LeetCode 的題比較多,想在短短几周內刷完基本是不可能的,所以我主要按照類型去刷,每一個類型刷幾道就會比較有感受了。好比鏈表的題優先考慮遞歸和雙指針來解決,棧和隊列的題優先考慮用兩個棧或隊列來解決,樹的題基本都是遞歸等。不過數組和字符串的題通常比較靈活,這種題只能儘可能多刷了。平時要上班刷題也不方便,我採用的方法就是看題,用手機打開 LeetCode 的網站,看完題目後直接想解決方案,腦子裏大概捋一下代碼怎麼寫,能想到的就過,想不出的就看看別人的解法,用這個方法刷起來就很快。用這種方法你可能會擔憂面試時題寫不完整,其實不用太擔憂,由於面試的時候面試官看你寫的核心思路是正確的,邊界處理是對的基本就過了,面試時間比較有限。c++
理論基礎
基礎這一塊主要以快速複習爲主,主要是語言、操做系統和網絡編程。校招這一塊會問題的比較多,社招這一塊問的比較少,可是若是這一塊打不上來就比較尷尬了。語言就不說了,這一塊你們應該都知道會考些什麼,校招的時候畢竟都瘋狂準備過。操做系統就看內存管理、進程管理和文件系統,通常虛擬內存問的多。網絡編程這塊就包括 TCP/IP 協議,HTTP協議,網絡安全三個方面。TCP/IP主要就是三次握手,四次揮手,TIME_WAIT 的做用等這些常考的題了。HTTP 協議考察 HTTP 協議的返回碼、HTTP 的方法等。須要特別指出的是 HTTPS 加密的詳細過程要很是透徹,否則容易產生一種感受好像都清楚了,可是一問就有點說不清楚。最後就是網絡安全,主要考察也是 WEB 安全,包括XSS,CSRF,SQL注入等。面試
後端技術
這裏的後端技術主要指工做中要用到的一些基礎組件,一些常見的後端架構設計。主要準備了MySQL、Redis、消息隊列、zookeeper、分佈式系統架構設計和docker。Redis 主要本身總結了一下 Redis 的使用場景,以及 Redis 實現分佈式鎖基本 Redis 就沒有問題了。消息隊列的開源軟件比較多,我主要選擇網上學習技術和一些技術文章等。分佈式系統的就準備CAP理論、BASE理論、限流、熔斷、一致性***算法、主從架構、集羣架構、異地多活、負載均衡、分層架構、微服務等。redis
深挖項目
沒有參與開源項目的經驗,工做中作的項目也很通常,項目這塊我實在沒什麼太多拿的出手的,不過仍是要挖掘一下,畢竟這一塊是逃不掉。我說幾個我思考的點吧:算法
- 找項目中相對而言具備亮點的地方。好比我用 redis 實現了一個延時隊列,而後對這個延時隊列我經過分片來解決瓶頸,經過分發來加快處理速度。這個雖然不是什麼複雜技術,可是能夠將其考慮全面能夠展現出本身具備必定的架構能力。
- 找項目中複雜的地方。若是你作的項目中有複雜的地方,即便不是你作的,也能夠拿來講,前提是你要搞得很是清楚來。
- 量化指標。一個接口原來有性能問題,好比你作了一個小的優化,將其 TP99 的耗時從原來的 500ms 優化至多少 200ms。
- 賦能整個團隊。在開發業務的過程當中確定會遇到一些重複的工做,或者能夠複用的服務。你能夠開發了某個工具或者服務化了某個功能推廣到了全組使用,給公司創造了價值。
Shopee
一面
- mysql 有那些存儲引擎,有哪些區別
- mysql 索引在什麼狀況下會失效
- innodb 與myisam 的區別?
- mysql 的索引模型
- mysql 主從同步怎麼搞的?分哪幾個過程?若是有一臺新機器要加到從機裏,怎麼個過程。
- 樂觀鎖與悲觀鎖的區別?
- binlog 日誌是 master 推的仍是 salve 來拉的?
- redis 持久化有哪幾種方式,怎麼選?
- redis 主從同步是怎樣的過程?
- redis 的 zset 怎麼實現的?
- redis key 的過時策略
- hashmap 是怎樣實現的?
- tcp 的握手與揮手
- select 和 epoll的區別
- http與https的區別,加密怎麼加的?
- raft算法和zk選主算法
- Kafka 選主怎麼作的?
- kafka 與 rabbitmq區別
- kafka 分區怎麼同步的
- kafka 怎麼保證不丟消息的
- kafka 爲何能夠扛住這麼高的qps
- http各類返回碼,401和406啥區別?
- redis 哨兵和集羣
- kafka partition broker consumer consumer group topic 等都是啥關係?
- 兩個單向鏈表,返回求和後的鏈表結構,例如2->3->1->5,和3->6,結果返回2->3->5->1
二面
二面沒什麼好說的,和麪試聊人生去了,我覺得是要涼的節奏,可是卻拿到了offer。sql
三面
HR 面docker
騰訊
騰訊面試提早1天和提早一個小時都會發短信提示。去的騰訊濱海大廈面試,大樓的現代化程度很高,不過須要提醒一下的是,騰訊的濱海大廈分爲南塔和北塔。我去的時候就上錯樓了,須要下到4樓從新換成電梯。編程
一面
筆試後端
- 微服務的特色,如何實現服務發現和負載均衡
- c++內存管理
- time_wait在哪一端產生,做用是什麼
- 程序crash如何定位
- 服務性能問題如何定位
- 兩個排序數組找中位數
- 就數字n的平方根
- 設計一個算法,抽獎次數越多中獎機率就越高
- MySQL 如何分析一條語句的執行過程。delete from t1 limit 3和delete from t1的區別?
面試
- 問項目
- 跳臺階
- 數組中奇數個元素
- 一棟樓有n層,不知道雞蛋從第幾層扔下去會碎,用最少的次數找出恰好會碎的樓層
- 動態規劃與貪心有什麼區別
- redis數據結構的底層實現
- redis如何實現高可用
- 負載均衡算法有哪些
- 服務發現是怎麼實現的
- 熔斷是怎麼實現的
- id生成器怎麼實現的,如何實現全局遞增
- 協程和線程的區別
- 進程間通信方法
- 平時逛哪些論壇,研究哪些算法
- paxos算法,這個算法我說不清楚,而後說了raft算法
- gdb怎麼切換線程
- 如何判斷一個圖是否有環
- 介紹一下緩存
- 查看 CPU 的命令和磁盤 IO 的命令
二面
- 項目的系統架構畫一下
- 若是用戶量上漲怎麼優化
- 負載均衡的加權輪詢算法怎麼實現
- 揹包問題
- 貝葉斯的機率學原理
- 分詞算法
- 連續整數求和(leetcode 第 829 題),要求時間複雜度小於O(N)
總結
騰訊二面面完我就知道涼了。動態規劃非要寫出遞推公式,由於我一直都是用動態規劃表的思路來解題,因此這個地方沒有答好。後面又問貝葉斯和分詞算法,一點都不會(個人心裏:我是來面後臺的,又不是面算法的)。最後一道算法題只能想出 O(N) 複雜度的,面試官必定要小於 O(N) 的,答不上來。這道題是 leetcode hard 級別的難度,因此沒有刷。不事後面去看可能也沒有那麼難,只是這種經過數學公式的特色來解題每每容易被忽略了。總之,騰訊的一面算是中規中矩,二面確實讓我有點手足無措。以前看網上的說法是騰訊算法題考的比較少,可能仍是要分部門吧,我此次面試的是騰訊視頻,二面基本上全是考算法。還有大部分面經都說,算法題不多考 leetcode hard 級別,這個我也要表示懷疑了,由於騰訊和後面的頭條都考了 hard 級別的。因此刷題時不能徹底跳過 hard 級別的題。那有什麼題不會考呢?我認爲是描述起來很複雜的題面試時不會考,由於面試時間比較緊,若是光時把題看懂都要解釋半天的,這種是不太會考的,好比那個 LeetCode 上買股票的題。
字節跳動
一面
- 問項目
- 任務系統怎麼保證任務完成後發獎必定成功
- zset 延時隊列怎麼實現的
- redis 數據結構有哪些?分別怎麼實現的?
- redis 的持久化
- mysql 的索引
- 一個無序數組找其子序列構成的和最大,要求子序列中的元素在原數組中兩兩都不相鄰
二面
- Redis 的 ZSET 怎麼實現的? 儘可能介紹的全一點,跳躍表加哈希表以及壓縮鏈表
- Redis 的 ZSET 作排行榜時,若是要實現分數相同時按時間順序排序怎麼實現? 說了一個將 score 拆成高 32 位和低 32 位,高 32 位存分數,低 32 位存時間的方法。問還有沒有其餘方法,想不出了
- MySQL 事務的四個隔離級別? 先說了四個級別的區別,而後說了每一個級別可能產生的問題
- binlog 日誌和 redolog 日誌清楚嗎? 說了兩個日誌的做用以及兩階段提交
- C++ 的動態多態怎麼實現的?
- C++ 的構造函數能夠是虛函數嗎?
- 缺失的第一個正數(leetcode第41題)
- linux 系統裏,一個被打開的文件能夠被另外一個進程刪除嗎?
- 一個 10M 大小的 buffer 裏存滿了數據,如今要把這個 buffer 裏的數據儘可能發出去,能夠容許部分丟包,問是用TCP好仍是UDP好?爲何?
- 一個完整的 HTTP 請求會涉及到哪些協議?
三面
- 問項目
- redis 的 ZSET 是怎麼實現的?
- 讓你設計一個限流的系統怎麼作? 令牌桶
- 讓你設計一個延時任務系統怎麼作 說了兩個方案,一個是使用 redis 的 ZSET 來實現,考慮分片來抗高併發,使用 redis 的持久化來實現落地,使用 redis 的哨兵實現故障轉移。 一個是使用時間輪的方法。
- 現有一個隨機數生成器能夠生成0到4的數,如今要讓你用這個隨機數生成器生成0到6的隨機數,要保證生成的數機率均勻。
- 有 N 枚棋子,每一個人一次能夠拿1到 M 個,誰拿完後棋子的數量爲0誰就獲勝。如今有1000顆棋子,每次最多拿8個,A 先拿,那麼 A 有必勝的拿法嗎?第一我的拿完後剩餘棋子的數量是8的倍數就必勝,不然就必輸。
- 給出一棵二叉樹的根節點,如今有這個二叉樹的部分節點,要求這些節點最近的公共祖先。
四面
HR 面
總結
頭條4輪面試都是視頻面的,視頻面試體驗其實仍是挺好的,坐在家裏面試我會更加放鬆一些,這樣腦子也靈活一些。人一緊張腦子就轉不動了。頭條的3輪技術面都問了zset的實現,ZSET的實現能夠好好看看源碼怎麼實現,這樣說的時候有更多東西能夠說,不是說一個跳躍表就完事了。還有一點就是遇到不會的邏輯題或者算法題不要放棄,問問面試官可不能夠提示一下。若是能在面試官的慢慢提示下能完成這道題,也是會被承認的。
最後
歡迎你們關注個人公衆號:前程有光,金三銀四跳槽面試季,整理了1000多道將近500多頁pdf文檔的Java面試題資料,文章都會在裏面更新,整理的資料也會放在裏面。