鑑於近年來LeetCode刷題被神化,被認為是面試必備
所以我想以5年多以來無論是當面試者還是當面試官的經驗
來分享一下如何準備面試
首先先分享一下我的經歷
我不是什麼強者,沒有參加過ACM競賽,Code jam頂多做兩題
美國碩士畢業後,LeetCode刷了250題左右,Google onsite後被HC拒了
去了另一家公司後,待了幾個月上個簡單的課之後就開始當面試官
才開始理解到面試官要的是什麼,之後FLAG裡除了FB沒面過外其他Offer都拿過了
以下從面試官的角度分析該怎麼準備
面試官不是專業的
面試官其實只是工程師稍微上點課知道什麼該問什麼不該問,還有態度該如何
除此之外和你一樣就只是個工程師,因為平常都在工作對刷題肯定比你陌生
所以大部分面試官其實都只關注幾點(應該說是被要求要注意哪些部分)
1. 有沒有問對的問題
其實主要是想要看面試者的互動能力,通常面試官會簡單的把題目敘述一下
這時候就是希望面試者可以主動重述題目,然後對題目的外在環境提出問題
例如: input的範圍限制?、data是online/offline?、output的格式?
這時候就是想測試面試者有沒有能力把一個問題轉化成一個可執行的計畫
2. 程式碼的可讀性/乾淨程度
理由很簡單,面試官都是假設以後要和你一起工作的,所以平常練習請把程式碼寫乾淨
變數命名合理一看就知道作用,一個function一個用途,不要擠太多不相關的邏輯
可讀性差通常在評分上是致命的,而且是大多面試官無法忍受的
3. 溝通、溝通、溝通
面試官都被要求把面試當作和一個不熟的人一起做個小專案
這時候溝通很重要,不要讓面試官一頭霧水不知道你現在的進度是哪裡
就算你知道題目怎麼做,你解題的流程可能也和面試官不同,或者是對實作的見解不同
溝通在評分上是"絕對致命",你悶頭自己把答案寫出來不代表很聰明
而是未來和你工作很辛苦
4. 測試!
這是刷題的後遺症,面試沒有一鍵測試這種功能
請自己在重述題目時順便想好哪些可以測試的input/output,並且包含edge cases
很多時候不是自己解題的想法錯了,而是實作中的bug
面試官也不會主動幫你走程式的流程來幫你驗證對不對,請自己證明自己寫的是對的
少了測試有時候你會聽到面試官說:「我想應該是對的吧」
這時候回頭肯定會在你的評分裡寫上少了測試
少測試的扣分可大可小,看題目的難易度
5. 有沒有解出來,有沒有optimal solution
其實這部分只要有個一般解,測試過了,基本分就拿到了
optimal solution基本上除非你是被考了很簡單的問題
不然只要你能和面試官討論怎麼優化,有哪些trade-off,就拿到基本加分了
實作不是一定必要,或是一定得寫完整,因為你的一般解已經展現實作功力了
以上是大公司FLAG/FAANG的基本面試要點
一些新創的奇怪面試又是另外一回事,也很難分享如何準備
另外System Design是一個比較難標準化的東西,所以我就不獻醜了
回到要不要刷題這個問題,我認為的是
- 刷題可以幫助你熟悉/複習演算法和資料結構,所以刷一下是需要的
- 題數不用多,如果你可以看到一個題目立刻知道怎麼解,那題就不用繼續寫了
- 刷題請給自己限時,1小時/45分鐘的面試通常只會給你45/30分鐘的做題時間
扣除掉各種溝通問問題的時間,我都是給自己每題20~30分鐘
- 如果你確定onsite要用板書,做題時請分配一些給自己用紙筆作答
- 自己先想好怎麼測試,不要過度依賴LeetCode的工具
- 語言不重要,除非你確定你要面試的公司只考特定語言
- 考前請人給你mock interview訓練臨場反應和溝通,這和刷題同等重要
以下刷題數僅供參考
因為我每次重新刷題都會開一個新session,所以有記錄我每次刷的題數
第一次跳槽90題,拿到Apple、VISA和新創(其實Apple不考算法題)
第二次跳槽110題,拿到LinkedIn和獨角獸新創
第三次跳槽140題,只面Google且拿到Offer
最後祝大家Offer拿好拿滿,希望這篇文章能幫助不知從何準備面試的人