談談coding面試的種類與基本應對策---一畝三分地帖子

Tech In Pieces發表於2021-01-02

Refer:
coding面試中類與基本的應對策略

Coding 種類與應對策略

大致上, 面試官在開始面試前, 會收到一封email, 裡面回大致說明每個人需要側重於考察面試者的哪個方面。 對於coding來說, 一般有三類問題, 每個面試官會被分配到一類問題。
1.solid coding
這類問題說白了, 誰都知道怎麼做, 純粹就是考察coding是不是紮實, 平時自己寫code多不多, 能不能快速的把自己的idea轉化為code。 對於面試者來說屬於必考種類, new grad 一般會有兩輪甚至三輪這樣的題目, 有很多工作經驗的人可能就只有1輪了。 這類題目不過關, 很可能電面死掉或者前幾輪突然死亡。
solid coding又一般可以分成兩個小類:
1.1 考察你對演算法的基本理解以及邊界條件的運用, 比如findkth largest integer, search in rotate array, bit manipulation 等等。
1.2 考察你對基本資料結構以及複雜度的理解。 比如binary search tree, linkedlist vs array, stack, tree dfs, tree bfs 等等。

按難度來分, easy的比如3 sum, tree level order iterator. medium 難度的比如 reverse linked list from index m to index n, course schedule,string multiplication, hard 難度的比如valid number, 複雜的calculator等。

總結:這些都是老生常談了 但是離真正做好還有一段距離。

應對策略

1.1 型別, 如果是簡單和medium的沒得說了, 就是希望你又快又好, 除了勤奮和熟練, 沒有什麼好策略。 對於像merge sort, partition這類的演算法, 如果7-8分鐘還寫不出bug free我估計就沒戲了。easy問題請多多注意邊界條件, int 溢位, nullpointer, 負數, 非法輸入等。
hard 1.1的請參考1.3
1.2 型別, 簡單和medium請在寫程式碼前多闡明覆雜度, 這類資料結構的問題往往也可以在coding前畫圖來表示執行狀態, 圖畫的清楚也是個重要的加分項。 hard請參考1.3
1.3 hard型別的coding題目. 這往往是考察你的solid coding的能力, 即我在前文中提到的, 你做事的方式和你思考問題的方法。 即給你一個coding任務, 你如何從白板開始, 一步步的做出bug free的程式。 這類問題的過程重於結果。 比如valid number, 你能確保每實現一個模組, 都沒有regressgion, 都沒有bug, 比你一下子實現所有的feature但是有很多bug 要好很多。 一般來說面試官看你是否能夠一步步的分隔出小的coding模組(method), 你如何設計test case, 你如何能夠確保這些test case能cover所有的scenario, 你是不是和麵試官提前做了足夠的溝通並且限定了coding範圍。 從這個角度來說, valid number其實是個很不錯的solid coding面試題。 限於篇幅, 我就不展開來說了。

2 problem resolving
這類問題對於new grad是關鍵, 也是能幫你differentiate的關鍵。 說白了, 計算機並不是只有演算法,我們還需要資料庫, 作業系統, 網路, 安全等方面的知識。 new grad這些方面要弱一些, 所以面試者希望new grad能展現出思維敏捷, 多思考, 快速反應的能力(幹!我正好相反 思考總是走神,反應速度也很慢)。 problem resolving就為了考察這個能力而誕生的。
problem resolving也可以分成四個小型別。
2.1 API design. 這類問題是為了更深入的考察你對資料結構的理解與運用。 例如LRU cache, insert delete getRandom ALL O(1) , design twitter等等。
2.2 Abstraction. 這類問題是考察你能不能把一個相對抽象的問題規約到你熟悉的問題上面。 比如skyline problem, int stream find median, cleaning robot等等。
2.3 計算機小程式, 例如thread pool, 爬蟲,日誌merge等, random generator等。
2.4 dynamic programming問題。 這類問題有點像solid problem resolving. 主要考察你是不是有systemmatic的方法來降低一個brute force程式的複雜度

這類問題一般都不是很easy的問題, 根據面試官心情, 可能走的很深很難。 也可能最後演變成bar raiser.

應對策略2

2.1 主要考察你對資料結構的深層次認識。 首先請同時確保你理解了題目的意思, 最好能問清點條件 例如immutable array max subarray sum, 那陣列將來會變嗎?問清這類的問題有助於你寫程式碼前做好重構和測試的準備。 其次, 如果你能證明你選擇的演算法的複雜度, 甚至證明這就是最佳複雜度, 那是一個大大的加分項, 如果不能, 至少你也問問面試官是不是已經滿意了再開始寫程式碼。
2.2 這個我自己也頭疼, 說實話如果第一次遇見了skyline, 我也不知道能不能搞定。 大家有好辦法請回復有什麼好辦法能系統化的解決這類的問題, 我個人覺得很多時候靠靈光一閃。
2.3 這類問題主要看你平時積累, 也是一大類不能通過leetcode練習的問題。臨時抱佛腳的話, 我個人推薦java concurrency in practice這本書。
2.4 動態規劃, 我不知道為什麼很多人害怕動態規劃。 面試中的動態規劃大致分為單向遞迴(首或者尾), O(n2)或者O(n3) 距離遞迴, O(mn)遞迴,有限定條件的NP (揹包)。 每種型別聽幾節課, 懂了基本原理即可。 至於貪心和帶狀態的dp(走道鋪磚)一類的dp, 至少我沒在面試中遇到過, 因為很難臨時造出一道這樣的題目, 面試官一般也沒這個能力和時間來思考題目是不是嚴謹。 貪心準備下加油站, 迪傑斯特拉, 最小生成樹就足夠了。

3.bar raiser
這類的問題只有當onsite應聘者的數量遠遠大於head count的時候, 或者你前幾輪明顯超出了電面時對你的定位才會發生。 其目的是幫助公司選擇最優秀的人。 對應聘者來說, 壞訊息是要度過痛苦一小時, 好訊息是你能充分了解這公司厲害的人有多厲害, 能充分展示你的能力, 甚至被越級錄取也不是不可能。
bar raiser也是三小類。

總結:
道理我都懂 但是…

相關文章