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