如何應對互聯網大廠的手撕代碼?

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

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

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

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

他一上線,窗口這頭的冕世冠便看着他笑,客氣的問道“知道面對對象嗎”。

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

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

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

接連便是難懂的話,什麼“動態規劃”,什麼“KMP”之類,引得冕世冠也頓時放鬆了起來。

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

以上故事純屬虛構,各位看官圖一樂呵。不過也說明互聯網大廠在面試校招生的時候,還是非常在意候選人的算法思維和代碼能力的,特別是某條。

但是手撕代碼這一塊的確是最難準備的環節,對於絕大部分沒有算法競賽經歷的同學來說,得依靠劍指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之前的我都建議刷一下,後面的就看心情和精力了。
在這裏插入圖片描述

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

上面說了那麼多,其實都是在面試前的準備工作。但是就算準備工作做得好,也不代表一定能夠發揮得好。

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

1 保持冷靜

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

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

2 嘗試交流

在短暫的思考過後,如果有了初步的思路可以試着跟面試官探討。不必急於向面試官求證你的思路是否正確,更重要的是能夠具有邏輯性和條理性的表達清楚自己的想法。

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

3 展現足夠的代碼能力

手撕代碼我認爲是有兩方面的考察的,一是算法思維,二是代碼能力。很多時候我們都是有了代碼能力,但是沒有具備足夠的算法思維。

所以當在沒有想到完整問題的解法的時候,可以先嚐試寫些基本的處理代碼,起碼能夠讓面試官覺得你還是經常寫代碼的,只是可能這個時候狀態不好,沒有思路。

這不是取巧,而是儘可能的爲自己爭取一點機會吧。

4 要有思考過程

有時候手撕的代碼可能剛好你刷過,甚至你一不小心還對代碼很熟練。這當然是個好事情,但是你並不能顯得自己是背過代碼的感覺。

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

5 思維比把解決難題強

我經常聽到同學說“那個誰誰在面試的時候,手撕代碼題賊簡單,所以面試才能過;不像我這麼慘,出了一道leetcode困難的題,才把我刷了。”當然這種說法可能也有一定的原因吧,但是我情願相信是思維能力差了點。

能做出難題的確很厲害,但是人家能做簡單題不代表做不了難題。我的意思其實是在面試的時候,不要因爲題目難度而放棄了思考。

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

最後在HR面的時候還聽到二面面試官跟別的面試官在閒聊,說 “ 面了這麼多人,也就那個×××(我的名字)表現還不錯 ” 。我都驚了…本來以爲肯定掛了。

總結

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


關注我的個人公衆號【業餘碼農】,回覆【算法】可獲得更多BAT高頻算法詳解,讓我們一起刷題複習進大廠!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章