## Leetcode 400 題了,寫點心得? ## 背景 NTU 資工系、資工所畢業,除了上一份工作因為要當面試官有稍微碰一下 Leetcode 之外,今年以前都沒刷過題,完全靠大學上過的各種演算法課吃老本XD ## 進度 就直接根據刷題進度來分享自己在各階段做了哪些事吧。 ### 0 ~ 150 題 1. 直接上 neetcode 150 跟著 roadmap 刷 2. 因為本身就有一點底子,所以沒有付費解鎖課程,遇到不熟的主題直接上網找對應的內容來看,當然如果你個人本身零基礎或是基礎本來就不穩,需要一點系統性的整理,投資一點小錢解鎖課程我覺得完全不虧,知識無價 3. 題目切半:每個主題我會把題目粗略根據難度切成兩半,分兩次跑: * 上半:主要是 easy & medium 的題目,目的是學習 * 下半:主要是 medium & hard 題,目的是複習 4. 不要求什麼解法都一定要靠自己想出來,20 分鐘想不出來就直接看解答完全沒問題,但如果可以一定盡力要求自己看懂各種解法,內化成自己的東西。當然也不是說靠自己想出來這件事情不重要,只是單純覺得不適合在這個打底的階段做而已 (這時期心裡常見的 OS:原來中文還可以這樣排列組合啊? 是我見識的太少了.jpg) 5. 紀錄寫過的題目:這件事情至今都還有在做,我會把每天寫過的題目記在 excel,內容包含寫的過程,自己的思路過程還有最佳解怎麼做,並且根據解題情況上色。 例如:完全沒寫出來的題目標紅色、有寫出解但不是最佳解,標個藍色、有寫出最佳解,但也有其他不錯的解法值得回顧,就標個綠色 這樣之後複習的時候就可以很快找到應該要複習的重點,尤其是面試前需要大範圍複習的時候。而且這東西紀錄久了還滿有成就感 (? 有些人甚至會把時間複雜度跟最佳解的時間複雜度也整理上去,但這個我覺得就看個人,就記你覺得未來的自己會想看的東西就好XD  6. 整理筆記:我會針對某些很常看到的題型自己整理一些東西,幫助自己融會貫通 (?),例如大家應該都有看過給你一堆數字找 duplicate 這種腦筋急轉彎的題型,那個花招之多整理出來一起看就很舒服:  7. 練習判斷並忽略過於冷門 or 太通靈的東西:例如 169. Majority Element 官方解答用了一個 Boyer-Moore Voting Algorithm,雖然這是很棒的演算法,這真的給我幾年都不一定想得出來,面試官基本上也不會預期你應該要會這種東西,因為沒什麼考點。至於要怎麼判斷這種內容,當你看到大家的留言都長這樣,大概就可以知道了XD: * DAMNNNNNNNNN it's too hard. * Does the interviewer really expect the candidate to answer using Boyer-Moore Voting Algorithm? * In 2024 interview, I was rejected by interviewer since I don't know Boyer-Moore Voting Algorithm. 8. 最後是一個初期我覺得非常有幫助的筆記:[Leetcode刷題學習筆記–心得統整](https://hackmd.io/@meyr543/r1skFcvgY),內容之強大就不贅述。 ### 151 ~ 250 題 刷到這個階段其實感覺基本上可以應付絕大多數公司的面試了,可以根據自己需求決定要怎麼規劃刷題方向,覺得已經刷夠了可能就刷個 daily 維持手感,把心力放在面試的其他方向上,如:BQ、專業技術題 (ML, system design 等等)、英文口說等等。 當然如果 targeting 外商如 Google, MS 的話可能就還要繼續往上刷到週賽 rating 可以到 1800 甚至 2000 左右的程度。我自己在這個階段的刷題主要針對這三個目標:**維持手感**、**持續提升能力**、**培養面試策略**,做的事情如下。 --- 1. **題目想完再動手**:主要是針對面試的訓練,刷題跟面試畢竟還是兩回事,這些訓練如果平常不特別做,也沒特別找人 mock interview,就根本不會有機會練習到。 首先看到題目後我會開始計時,並假裝現在正在面試,把腦中出現的想法都記錄下來,模擬 think out loud,包含: * **scoping**: 數值範圍多大、有什麼特別的性質可以用 (array 已 sort ? value 範圍很小?value 都是 positive?) 有的公司非常注重這部分,尤其是 Google,他們的題目甚至會把內容挖空讓面試者自己問出來,並且會列入評分考量。筆者自己之前也有過 scoping 沒做好導致誤解題意,寫出一個完全不正確的實作的慘痛經驗,最後時間不夠也這辦法修正 (至於為什麼方向不對但面試官還是讓我實作,就是另一個值得討論的事情了 Orz) * **observations**: 根據題目做的進一步推論或是可能的解題方向,例如:這題可以轉換成什麼問題、這題我只要考慮什麼就好、這題可能可以用 dp 或是 binary search 來做 * **solution**: 從已知的 observations 進一步得到的解法,用 pseudocode 的方式 step by step 寫下解法思路,以及 edge case handling 等,盡可能的愈詳細愈好 * **analysis**: 時間 & 空間複雜度分析,這個面試 100% 會問的部分就不贅述了 * **writing & speak in English (optional)**: 如果你想丟的公司是會要求英文面試的,你可以多做這件事情順便練習英文的口語表達,對於 I 人來說我自己覺得是個滿有用的訓練。我自己是都會用英文把上面這些事情寫下來,然後再嘗試自言自語的把這堆東西講出來 (自己 mock 自己XD) 上面這些事情都做完之後我才會讓自己開始 coding,理論上 solutions 的步驟你整理得愈清楚,coding 就會愈順利,流程也會比較有架構,比較不容易遇到 coding 時才想到有漏掉的東西。 (有經驗的應該就會知道,如果實際面試遇到 coding 卡住或是漏 case 真的是會緊張程度瞬間飆高,一不小心心態就崩了 Orz) 初期這些步驟是滿花時間的,但久了習慣之後就會愈來愈順了。至於面試其他要注意的事情或小技巧,這個寫下去應該也是一大坨,網路上整理的東西已經很多了,就不贅述了。 --- 2. **不分主題刷題**:主要練習看到題目如何切入適當的解題方向,畢竟實際面試你肯定是沒辦法像 leetcode 一樣知道這題的 topic,例如: * 看到 subarray:要想到 sliding window 或是 prefix sum + hash table * 看到 interval:要想到 sorting & line sweep * 看到 max / min:要想到 binary search 或 dp * 看到 matrix:要想到 BFS, DFS 或 dp * 看到 increasing subsequence: 要想到 LIS * 看到 graph:要想到 topological sort, Dijastra * 看到 string matching:要想到 trie 或 dp,(怎麼這麼多 dp 啊(惱 --- 3. **根據 Rating 刷題,不要刷水題**:leetcode 題目其實以前跟現在的難度差很多,前 1000 題的 hard 可能在現在來說只是 medium 而已,而現在的有些 medium 難度已經到了 rating 2000 以上,明顯超出自己能力範圍,所以我自己是會根據 rating 來選題目,主要是: * 避免花時間在 rating 太低的題目:這種題目你刷了你根本也不會進步,學不到東西,單純訓練 coding 速度而已 * 避免花時間在 rating 太高的題目:這種題目寫下去就只是打擊信心,看完解法你大概也只會覺得這他媽到底三小,鬼才會,學不到什麼東西 至於要怎麼看到 rating,這邊推薦可以去裝一個 google chrome 的套件:**Leetcode Difficulty Rating**,他可以把題目的難度用更數值化的方式呈現,至於 rating 的計算方法就不特別介紹了,可以再自己查查 --- 4. **這個階段的題目來源** * **Top Interview 150**: 刷完 neetcode 150 之後這個題單大概還有一半的題目可以刷,覺得不夠穩的可以把他刷完,當然你也可以把 Grind 75 & 169 刷一刷,我自己是覺得有些題目已經略基礎到不適合自己了就沒繼續刷 * **公司高頻率題**:如果你有買 Leetcode premium 的話可以考慮,或是找別人已經整理好的題單,我自己是有為了 Google 面試把 recent 30 days 刷完 * **Lee215 的推薦清單**:lee215 是誰應該不用贅述XD 他常常會在他的 solution 下面整理推薦題目,我自己覺得都是滿不錯的題目,如果想要清單的話我自己是有整理,可供參考:leetcode.com/problem-list/a72eqmx1/ * **Daily & Weekly Contest**: 這個階段我覺得已經可以每天寫寫 daily 培養面試題感了,當然如果你想接受更刺激一點的就是開始打 weekly 跟 biweekly context,如果每次週賽能至少寫出 2 ~ 3 題基本上外商面試應該就很穩 (btw 最近的週賽的水溫好像愈來愈高呢) ### 251 ~ 400 題 到這個階段我覺得刷題已經有點算是單純自我精進或是維持手感了,面試感覺已經不再是主要刷題目標,也就沒什麼特別的可以分享了。 我自己是單純有點興趣想要提高週賽成績所以有再去補充一些比較高難度面試冷門的內容,例如 Segment Tree、Binary Indexed Tree、KMP、Manacher's algorithm 等等,背一些 template,或是針對自己弱項把 DP 打掉重練跟著 [靈神的題單](https://leetcode.cn/circle/discuss/tXLS3i/) 來刷 (不知道是不是錯覺,我總覺得 DP 的題型真的太多變化了,跟鬼一樣) ## 其他 沒了,祝大家刷題 & 面試順利XD
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up