進入BAT和字節跳動最難的一關,手撕代碼!

在互聯網校招界,曾經流傳着關於應屆生面試互聯網大廠的一個傳說。面試

進入BAT和字節跳動最難的一關,手撕代碼!


傳說某個冕世冠打開視頻聊天的窗口時,窗口那頭正坐着位男人。他是宿舍裏不管春夏秋冬都穿着同一件格子襯衫的惟一的人。算法

他面容溫和,滿面油光,略微凹陷的眼窩彷佛剛剛熬了幾個通宵,稍稍靠後的發跡線展露出絕頂的智慧。穿的雖然是襯衫,但卻光鮮亮麗,一點沒有水洗多年而產生的褶皺和破敗。數組

他對人說話,老是滿口的性能優化最優解時間空間複雜度,叫人半懂不懂的。性能優化

他一上線,窗口這頭的冕世冠便看着他笑,客氣的問道「知道面對對象嗎」。數據結構

他也不正視鏡頭,低頭思索了一會,擡頭說道「知道一點」。以後便文縐縐的講了一大段定義。ide

冕世冠微微點頭,又忽然問道「你會手寫紅黑樹嗎?」 嚶界僧擡起頭,睜大眼睛說,「這…這太複雜了,我怎麼會…」。函數

「紅黑樹是基本數據結構,也是基礎算法。」 嚶界僧便漲紅了臉,拳頭在身下攥的牢牢的,青筋條條綻出,爭辯道「我劍指offer刷了66題!…這不能算是基礎算法麼?」性能

接連即是難懂的話,什麼「動態規劃」,什麼「KMP」之類,引得冕世冠也頓時放鬆了起來。學習

窗口內外充滿了快活的空氣。

以上故事純屬虛構,各位看官圖一樂呵。不過也說明互聯網大廠在面試校招生的時候,仍是很是在乎候選人的算法思惟和代碼能力的,特別是某條。
進入BAT和字節跳動最難的一關,手撕代碼!
可是手撕代碼這一塊的確是最難準備的環節,對於絕大部分沒有算法競賽經歷的同窗來講,得依靠劍指offer和leetcode來快速培養算法能力。優化

劍指offer66題好說,可是leetcode上千道題,從頭開始刷不只效率低下,而且沒法造成系統的算法思惟,實際上也並推薦。

我我的對手撕算法的準備時間大概是在兩個月,從去年暑假的7月到八月,最終順利經過字節跳動的面試環節。

這裏須要說明一點的是,字節跳動是十分看重算法能力的公司,通常技術三面基本一定會有手撕代碼環節,每次面試視狀況可能會有一道兩道的算法題,每題大概會給5-20分鐘,通常要求是要最優解。固然確定是存在個體差別的。

那麼到底應該如何準備手撕代碼環節呢,該如何有效而系統的進行刷題訓練呢?

01
面試考察的算法類型

1 原題
我本身感受原題的機率仍是挺大的,特別是劍指offer的66題更是如此。千萬別小看這66題,這幾十道題裏面基本全部的算法類型都有包括在內,經常使用的數據結構,操做方式,經常使用算法思路都有很多的題。

若是真的可以充分理解這幾十道題的最優解,我感受其實已經造成基本的算法思惟了。

另外,leetcode的原題也很常見,由於LC自己題量大,在裏面出原題不是爲了考倒你,而是檢驗你的刷題質量。

畢竟那些大公司面試官也不是傻子,知道你在面試前確定會大規模刷題的。因此把刷過的題徹底搞懂纔是最重要的。

2 改編題
改編題就很顯而易見了。改編題大多須要從基本的算法原理中找處處理的思惟,而後結合實際題幹進行性能優化,就可以搞定。

這裏要記得一點的是,正常的算法考察不會故意刁難你(正常狀況),也不會給過多的時間讓你思考和敲代碼。

因此遇到改編題不要想得太複雜,儘可能要找到它的算法思惟是什麼。怎麼說呢,透過現象看本質。我總結的改編題有如下幾種思路:

1)新的數據結構,換湯不換藥。好比最多見的排序算法的改編,原來是對數字進行排序,如今對鏈表排序等等。比較難一點的可能會遇到自定義的數據結構。可是算法本質不會變。

2)算法類型改編。
這裏要說的就是一個比較大的範圍,好比動態規劃、貪心算法、遞歸、回溯和分治等等。這種是從算法大的類型上進行改編,很難用相同的套路去解題。

遇到這類題的關鍵就是要先弄明白算法核心。好比動態規劃的狀態方程,貪心算法的局部最優狀況,遞歸回溯的邊界判斷,分治的子問題劃分等等。這種類型的確比較難把握,怎麼碩呢,每種類型的都來搞幾道感受感受吧。

3)添加應用題背景。
這種題目看起來不難,可是難就難在對應用題背景的理解,須要去理解題意,而後考慮合適的數據結構和處理算法。這裏面有數學建模的思惟在裏面,須要把一堆無用的信息剔除,篩選出有效的信息,而後才能選擇正確的算法。

3 創新題
這類題考察的是你的擴展思惟,若是說上面的題考查的是你的思惟深度,這種題就是考察算法的廣度。可能一看題目,徹底沒見過這種類型。可是算法自己其實不就是讓計算機代替人腦進行高重複性的計算嘛。

首先你須要想到你應該去怎麼算這個題,而後再換到計算機上,會發生什麼問題(空間時間問題,運行效率,代碼冗餘等等),以後再想經過經典的算法原理來解決這些問題。

不管怎樣,面試官總不可能讓你在短期內造一個新算法出來,解題思路確定是有所依託的。

02
短期如何系統刷題

說了那麼多,仍是得本身去刷題才行。那在時間不夠的狀況下,應該怎麼去刷題,怎樣才能造成系統的算法思惟呢?

1 題型分類
我按照我我的的習慣,喜歡按照一種類型狂刷,而後再刷另一種類型。通常常見的算法類型可分爲:

數組、鏈表
包含基本排序算法、二分查找、鏈表的一系列操做。

棧、隊列、堆
利用棧、隊列互相實現,堆的使用

二叉樹與圖
主要是遍歷算法和節點的計算:
二叉樹四種遍歷方式、廣度優先遍歷(BFS)和廣度優先遍歷(DFS),節點到節點距離等等。

哈希表
使用標準庫自帶的模板或者函數就很簡單了,通常會與其它數據結構相結合來提高時間複雜度。

字符串操做
字符串的操做也不少,本質上能夠看做是數組的操做。另外字符串的一些匹配和尋求字串的算法仍是很是具備思考價值的。KMP,馬拉車等等。

遞歸
重點掌握邊界判斷條件。

回溯
重點掌握邊界判斷條件。

分治
重點掌握如何劃分子問題。

動態規劃
題太多了,可從一階dp到二階dp理解不一樣的狀態方程。

貪心及其它
這個就很容易理解了,遇到貪心題應該要偷笑了。

2 高頻熱點多刷
這很少說了吧,Leetcode熱題HOT 100。你值得擁有。

在不知道怎麼刷的狀況下,不如先刷起來。刷個題沒那麼多捷徑,只有堅持刷起來了,纔會造成本身的思惟方式和學習習慣。

我建議是先按照類型刷,每一個類型刷十幾二十道。而後打混按照算法熱度排序從新查漏補缺。

3 思路回顧
許多同窗在一股腦刷了不少題以後,再看作過的題會發現忘了很多。可能你們都是這樣的吧。我以爲是由於在刷題的時候過於心急,理解了大概就過了,或者類型作的太雜,沒有留下印象。

我比較喜歡的方式是偶爾會從新看看曾經作過的題,就看題目而後想思路,再畫一畫步驟演進,沒時間就不細敲了。這樣能夠加強一下思惟記憶,以前理解過的東西,再回憶起來仍是很是快的。

03
Leetcode題號

每一個類型的題號我就懶得再單獨列出來,Leetcode上的篩選已經作得很是好了。點進來,選擇你想刷的類型,進去能夠先挑戰簡單的題,而後再到中等,再到困難。題號在300以前的我都建議刷一下,後面的就看心情和精力了。

進入BAT和字節跳動最難的一關,手撕代碼!

04
如何在面試中應對手撕代碼

上面說了那麼多,其實都是在面試前的準備工做。可是就算準備工做作得好,也不表明必定可以發揮得好。

畢竟面試存在太多的影響因素,你心理狀態、身體狀態以及和麪試官的交流氣氛都會影響你在算法題上的解題效果。所以在面試過程遇到手撕代碼,我有如下幾點建議:

1 保持冷靜
情緒這種東西是很難掌控的,有時遇到沒見過的題會慌張,有時又會被面試官的語氣干擾了思考。可是隻要在面試中,就還有機會。

在沒法靜心思考的時候能夠拿出紙筆先本身想一想思路,不必一看題沒見過就想着面試官可以給予提示。你在遇到問題時的思考態度反而更能打動面試官。

2 嘗試交流
在短暫的思考事後,若是有了初步的思路能夠試着跟面試官探討。沒必要急於向面試官求證你的思路是否正確,更重要的是可以具備邏輯性和條理性的表達清楚本身的想法。

就算這個時候你的思路不正確,也會讓面試官產生「你還挺有想法的」的判斷,對你的印象也會加分。

3 展示足夠的代碼能力
手撕代碼我認爲是有兩方面的考察的,一是算法思惟,二是代碼能力。不少時候咱們都是有了代碼能力,可是沒有具有足夠的算法思惟。

因此當在沒有想到完整問題的解法的時候,能夠先嚐試寫些基本的處理代碼,起碼可以讓面試官以爲你仍是常常寫代碼的,只是可能這個時候狀態很差,沒有思路。

這不是取巧,而是儘量的爲本身爭取一點機會吧。

4 要有思考過程
有時候手撕的代碼可能恰好你刷過,甚至你一不當心還對代碼很熟練。這固然是個好事情,可是你並不能顯得本身是背過代碼的感受。

面試官通常都很反感這種行爲,你這個時候能夠先試着講述整個算法思路,而不是急於在一兩分鐘內把這個算法整出來。

5 思惟比把解決難題強
我常常聽到同窗說「那個誰誰在面試的時候,手撕代碼題賊簡單,因此面試才能過;不像我這麼慘,出了一道leetcode困難的題,才把我刷了。」固然這種說法可能也有必定的緣由吧,可是我情願相信是思惟能力差了點。

能作出難題的確很厲害,可是人家能作簡單題不表明作不了難題。個人意思實際上是在面試的時候,不要由於題目難度而放棄了思考。

我曾經在現場面試美團的時候,二面面試官就出了兩道算法題,我一道都沒寫出來。可是我在面試的時候每一題都給出了好幾種思路,雖然代碼最終都沒時間寫完,可是也的確展現了本身的一部分能力吧。

最後在HR面的時候還聽到二面面試官跟別的面試官在閒聊,說 「 面了這麼多人,也就那個×××(個人名字)表現還不錯 」 。我都驚了…原本覺得確定掛了。

綜上所述,準備算法仍是須要堅持+規劃的。在面試前天天都須要刷點題找找手感,狀態好呢就刷點難題,狀態很差就刷點老題或者容易題。堅持下來,確定會有所收穫的。

做者:我是AJ,一個熱愛敲代碼的業餘碼農。

關注公衆號,第一時間獲取業餘碼農的技術分享!
進入BAT和字節跳動最難的一關,手撕代碼!

推薦閱讀(點擊下方連接便可閱讀)

女友跟我說「愛你愛你」,我首先想到的竟是「迴文數」!
苦逼研究生的幸運求職路
新冠肺炎肆虐,不如在家練練基礎算法 | 鏈表篇
建議簡歷寫很差的同窗進來瞧一瞧~
面試高頻算法詳解-LRU
想成爲BAT後臺開發工程師,這些是基礎!

Amazing10承蒙厚愛。

相關文章
相關標籤/搜索