A year of LeetCode
中間那塊灰色請自行在腦中用迷彩補上。
Origin
應該也在 FB 分享過了,2020 年 3 月實驗室同學百謙跟霸ㄅ在準備碩論的同時也開始在為找工作練習寫 LeetCode 題目,雖然我很雖小要當兵沒辦法畢業就接軌工作,但看他們開始寫我自己也是有點求職焦慮,感覺不寫到時候可能找工作會有問題,就在某天上午下定決心辦帳號寫了第一題 Two Sum。
Strategy
一開始按照編號開始寫,到第四題 Median of Two Sorted Array 卡住就覺得好像不應該用這種順序寫,後來就改成寫 Top 100 Liked Questions。
因為一開始就打算至少把這 100 題寫完,從裡面挑題目時我怕都挑簡單的之後只剩 Hard 可以寫,所以會盡量按照比例去挑不同難度的題目綜合著做,不過倒是沒有照著什麼特定的主題去刷。前期剛起步還是比較側重 Medium 跟 Easy,後面熟練了發現之前完全沒頭緒的 Hard 好像也沒這麼困難,就多寫幾題 Hard 把比例平衡回來。
Top 100 Liked 寫完之後就開始寫另一個免費清單 Top Interview Questions,但寫到一半發現蠻多很煩、負評很多的題目,就沒打算把這個清單全部寫完,開始從所有問題裡面按照當下心情挑不同難度寫。那個時候投稿剛好被 Shepherd 質疑一些事情、接著是跟指導老師來回修改口試投影片,對當時的我來說寫這個反而是某種投入就有立即回報、蠻紓壓的益智遊戲,心情不好就寫個五題壓壓驚,最後在六月畢業前寫完了六百多題。
平常寫的時候因為沒什麼時間壓力,如果遇到想一個小時還想不出來的題目,我會直接把題目關掉換下一題簡單一點的,把不會的那題留在腦中有空的時候想。如果過一天還是沒任何想法我通常就會直接看答案了,有時候一些技巧沒看過真的很難自己推導出來。
Contest
開始寫 LC 兩週後決定玩玩看 contest,一開始也沒特別覺得自己要拚什麼積分 (其實根本也沒人在乎),只是看到有人說練習 contest 可以給自己一點時間壓力來模擬真實的面試情況,就下去試試看水溫。開始玩的那幾個禮拜可能題目剛好比較簡單吧,完賽了幾次,除了玩出了一點成就感之外,也發現比賽的一個半小時真的還蠻刺激的,每次送完最後一題答案等 AC 訊息心跳都會急遽加快,於是到現在我幾乎每週六日都會上去寫一下 Weekly/Biweekly,甚至在當兵周末休假時還參加過幾次,就真的是當遊戲在玩。
另外附帶一提,當兵的時候印了一堆 Codeforces 跟 AtCoder 的題目進去邊行軍邊想,出來之後也開始玩這兩個網站的比賽,不過光是 Div.2 / ABC 就比 LC Contest 難度高很多也幾乎都寫不完,這個時候就發現對於真正ㄉ競賽仔來說 LC Contest 根本就是在練手速的 XD 蠻後悔高中時沒有發現這個這麼好玩,不然我應該也不會把所有時間都浪費在 Dota 上(吧)。
至於這個東西到底對面試有沒有幫助... 我覺得你如果要去面 FAANG 肯定是有的,參加比賽會訓練你看一眼題目的 constraint 就有直覺要從哪個演算法下手,面試時你光是有辦法在短時間內判斷哪些解法行得通,或是哪些可能會 TLE、但可以先講出來幫你拖時間想更好的解法,在面試官眼裡就加蠻多印象分的,而且也幫你自己爭取寫 code 的時間。不過我面了四家台灣公司,除了某新創界 google 以外,我自己是覺得為了找工作練這個是有點 overkill 啦,大部分都還是出中等難度以下,你太快寫完坐在那邊乾等下一位面試官也是有點尷尬。
真要說缺點的話,我覺得 LC 介面太友善到你寫完會想直接伸手過去按測試,而不會去逐行檢查有沒有哪裡寫錯、邏輯有什麼 edge case 會炸掉這件事。平常習慣不好、比賽就更不可能做這件事情,我常常寫完按測試範例測資 compile error 才發現有哪個變數打錯、然後重複了三四次才把類似的小問題修完。我面試幾乎每關講完解法後在寫 code 時都有點小 bug,雖然都及時自己發現,但如果是去面 FAANG 的話這個問題好像蠻傷的。
Thoughts
坦白講我覺得我這一年來寫題目的方式非常沒有系統,除了中間有段時間為了 contest 完賽專心練了所有 DP 問題以外,我都是用隨機的方式在選題目,所以如果你是下個月就要開始跑面試的人拜託不要學。但如果時間還很多,可以試試看長期規律把這個當成數獨來寫 (or better, 投資報酬率很好的數獨),找到其中的樂趣之後練習題目就會變成蠻開心的事情,而要是你逼我剛起步就在一周寫一百題我應該也會覺得刷題這文化很低能。
寫到後來開始覺得自己其他相關技能也需要補強 (e.g., OS、網路跟設計模式),不能把所有時間都花在刷這些題目上,所以現在平日大多時候就只寫每日一題賺賺積分,等週末再來寫新出的比賽題目。最後一次密集刷是在開始進入面試週期前,我花兩天時間把蠻多人推薦的 Blind Curated 75 重寫一次,邊寫邊講解給數甲滿分的強者我妹聽,練習跟真人解釋演算法,自己覺得幫助蠻大的。
最後,雖然 /r/cscareerquestions 一天到晚看到有人在抱怨面試考這種題目跟實際工作內容一點關係都沒有,或是炫耀自己一題 Medium 都寫不出來還是找得到工作,但事實上我認為不管是做什麼領域,對於常見資料結構 Big O 的敏感度都還蠻重要的,即使是看起來無害的 JSON Parsing。寫這些東西跟工作可能沒有直接的關聯,但我相信冥冥之中還是對於解決問題能力多少有所幫助,至少我是這麼相信啦。