【寫在開頭】最近微信推薦機制調整了,可能有些朋友會收不到我們的推送,請大家關注留學字典加上星標,以免錯過更多精彩內容!
最近phd快畢業了,焦慮找實習找工作持續了一年多,現在感覺快要迎來短暫的上岸期了,大概總結一下刷題相關的感悟,主要是自己總結將來反思用的。
地裡類似的經驗估計也不少,本帖很可能會有重複。Anyway,希望幫到有緣人,歡迎大家討論。
刷題零經驗或者不熟悉基礎資料結構演算法的需要先學習基礎功,基礎功達標永遠是第一步。這個帖子重心在後面的階段。
基礎功達到一定層次之後 重心轉成漲見識。
許多演算法套路沒見過就是很難想出來,見多了用多了自然就熟悉了,熟了之後才有可能在面試期間的高壓環境下提出來。
漲見識這裡就是常規的刷題。碰到一道題需要先自己想一想,然後嘗試做一做。不管做出來與否,都要仔細看leetcode會員答案,熟悉一種或幾種常見的最優解的思路,分析時間空間tradeoff。
漲見識階段有個問題就是,演算法這麼多年裡,奇技淫巧太多了,挨個學習過於費腦也花時間,所以這裡建議第一次見到的技巧熟悉high-level idea,重複見到的技巧演算法儘量熟悉掌握,尤其是重複出現而且想法簡單的技巧,比如常規DP pattern,monotonic stack。
rolling hash之類的演算法出現的少一些,但是想法簡單,這種學起來也成本不高,可以考慮。
過完漲見識階段大概碰到一個題會有基礎思路,接下來建議專門考慮一下code smell,如何優雅的實現與解題。
這個對於bug-free很有幫助,也是我個人感覺區分入門與內行的一個重要分水嶺。
聰明的初學者可以提出能用的解決方案,但懂行的人寫簡潔易懂的程式碼。
為了學習好的code smell,首先需要識別什麼是好的程式碼,然後檢查自己的程式碼尋找不夠優雅的地方,看看別人是怎麼做的。
這個階段只靠leetcode editorial還不夠,需要多刷一刷leetcode其他人分享的solution,尋找自己喜歡的程式碼。高手在民間。
過完code smell之後可以考慮研究hard怎麼解題。
很多人覺得很多hard就是不可能在面試期間簡單直接的整出來,當然有一定道理。
但刷hard的目的我覺得更多的是能輕鬆擺平medium,以及在有hint的情況下整完hard。這個階段訓練的是思維模式,如何入手hard。
我覺得對於hard題,找observation是核心。就像是推數學定理證明那樣,發現一個核心的observation就解決了hard題一大半的路,隨後圍繞核心的observation設計算法。
問題是如何找observation。從brute-force入手是一個說爛了的,但好用的思路。
除此之外,可以手動推到一些test case,檢查自己計算過程中有什麼規律。
先提出猜想,再分析驗證猜想是否成立。對於能在面試解決的hard,你只需要找到一個或者最多兩個規律、observation就可以了。
這需要一個訓練的過程,平時刷題就要多訓練。個人感覺這個能力遠比刷題更有意義。
observation還可以倒推尋找,從結果入手分析什麼對結果有利。歡迎大家討論有什麼尋找observation的思路。
有了observation和大概的演算法設計框架之後,建議先羅列high-level pseudo-code再動手寫程式碼,避免過早陷入細節糾結。
有的時候明明有了想法但就是程式碼沒法快速的寫出來,這個時候感覺先羅列high-level會有幫助。
最後就是平時練習保持手感,或者多做總結保證需要的時候能快速上手。
祝大家都能儘早上岸,事事順心!
文章來源:一畝三分地
《留學字典》原創文章精選
