從小白到 6 個(gè) offer,我究竟是怎么刷題的?
首先介紹下我的編程基礎(chǔ),我學(xué)的是金融工程專業(yè),碩士時(shí)學(xué)過 C++ 的課,這也是我的編程入門課(但我個(gè)人非常不推薦用 C++ 入門)。這門課的重點(diǎn)是 C++ 在金融領(lǐng)域的應(yīng)用,比如給 Option 定價(jià),基本不涉及算法和數(shù)據(jù)結(jié)構(gòu)。
所以我是有一定編程基礎(chǔ)的,但是對(duì)算法和數(shù)據(jù)結(jié)構(gòu)是小白,也不懂空間復(fù)雜度和時(shí)間復(fù)雜度為何物。
另外說明一下我的時(shí)間,我是在工作后才開始刷題,所以是晚上和周末來刷,時(shí)間比較緊張,如果是學(xué)生的話在我的基礎(chǔ)上要多刷一些喲。
下面上干貨。
我把我的刷題過程分為 3 階段。
第一階段:打基礎(chǔ)
時(shí)間是 3 個(gè)月,做了 128 道題,平均每天 1-2 題。
這一階段刷題對(duì)我來說,是一個(gè)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的過程。
所以如果是科班的同學(xué)這一步就可以跳過了。
經(jīng)常有同學(xué)問這個(gè)刷題順序問題:

我認(rèn)為在不同階段是不一樣的,那么第一階段我是按照算法類型來刷,每個(gè)類型大概花 1-2 周的時(shí)間。
那到底先刷哪個(gè)類型呢?
刷 DP?
這不是勸退么?
這里對(duì)于小白來說,合理的學(xué)習(xí)曲線是非常重要的,否則一上來數(shù)據(jù)結(jié)構(gòu)都不清楚去做難的算法題容易受打擊。
那么怎樣才是合理的學(xué)習(xí)曲線呢?
我說的不算,其他人的也只是他個(gè)人經(jīng)驗(yàn),而應(yīng)該是看名校的口碑課程是怎么安排的,看教授為你制定的學(xué)習(xí)計(jì)劃。

比如第一周,我們?nèi)ニ⑴判蛩惴ā?/p>
那在這個(gè)具體的分類下,題目按什么順序來做呢?
把題目按照頻率從高到低的順序來做,也就是出現(xiàn)頻率高,??嫉奈覀兿茸觥?/p>
那對(duì)于每一道題應(yīng)該怎么做呢?
首先我會(huì)先自己思考 5 分鐘,那如果過了 5 分鐘還沒有任何思路,就不必強(qiáng)求了,看答案吧。
Leetcode 有一個(gè)討論區(qū),里面有非常多的大神給的解答,重點(diǎn)不是看他的代碼,而是看他怎么想的,怎么分析的這個(gè)問題。

如果還沒有理解,那我會(huì)去搜一下視頻講解。
這里推薦一個(gè)小哥,也是我唯一推薦的 Leetcode 視頻講解:
國(guó)內(nèi)的小伙伴可能不太方便看這個(gè),大家在留言區(qū)說下你推薦的視頻講解吧~

對(duì)于在北美求職的同學(xué),這小哥的英文對(duì)面試也會(huì)非常有幫助。
這樣就把一個(gè)刷題計(jì)劃落實(shí)到了第一個(gè)分類、第一周、第一天該做什么。
但是做完題不是就萬事大吉了,最重要的一步是需要吸收、內(nèi)化成自己的。
我喜歡的是寫“解題報(bào)告”:
<<< 左右滑動(dòng)見更多 >>>
把這道題考查了哪些知識(shí)點(diǎn),正確的思路是怎樣的,別人是怎么想到的,代碼是怎么寫的,代碼有什么小技巧,都記錄下來。
這個(gè)是跟我當(dāng)時(shí)一起刷題的小伙伴學(xué)的,并且我們互相講題,這樣效果更好。所以這里強(qiáng)烈建議大家組隊(duì)刷題,互相監(jiān)督提高。
那么周末的時(shí)候復(fù)習(xí)和總結(jié),我一般會(huì)做:
重新做一遍本周做過的題目,不是背答案,而是自己再去想一遍; 再做幾道新題; 看書,建立更系統(tǒng)的知識(shí)體系。
這里看書不是指把書從頭看到尾,而是抓住重點(diǎn)章節(jié),比如排序算法,那就參考 MIT 教授給你畫的重點(diǎn),只看《算法導(dǎo)論》的這些章節(jié),這才是偷懶的正確打開方式啊。

不過,如果你的時(shí)間很充足,當(dāng)然是系統(tǒng)的看書、上課更好了,會(huì)有更加平緩的學(xué)習(xí)曲線。
這樣 3 個(gè)月后我把基本的算法類型都刷過了,數(shù)據(jù)結(jié)構(gòu)也都深入理解了,剛開始做的題目也差不多都忘了,那么開始第二階段。
第二階段:拓展思路
這一階段我花了 1 個(gè)半月的時(shí)間,復(fù)習(xí)了第一階段的題目,并做了 100 道新題。
平時(shí)工作日的時(shí)候,我會(huì)去復(fù)習(xí)第一階段的題目,并且用英文把它講出來,畢竟我要參加英文面試,如果是國(guó)內(nèi)面試的話中文就好了,然后你就會(huì)發(fā)現(xiàn),自己是不會(huì)說話的,不信你錄音聽一聽。 周末時(shí),我會(huì)限定時(shí)間去做新題,模擬考試或者面試的感覺,在有時(shí)間壓力下去思考,否則給充足的時(shí)間大家都能做出來。
這一階段我是記錄在 Excel 里:

第二階段做的差不多的時(shí)候,就把 Linkedin 設(shè)置為 “open to market“,就會(huì)有獵頭找我了,那一旦拿到面試,就到了第三階段。
第三階段:面試
這一階段的重點(diǎn)是找到面試的狀態(tài)和感覺,并且快速寫出代碼。
那么我的方法是
Mock interview 參加 Leetcode contest
這一階段的刷題順序我會(huì)按公司分類來刷,Leetcode 上有 company tag,如果是國(guó)內(nèi)的小伙伴可以參考這個(gè) Github: https://github.com/afatcoder/LeetcodeTop,列舉了國(guó)內(nèi)幾大互聯(lián)網(wǎng)公司??嫉拿嬖囶},那么就會(huì)更有針對(duì)性的準(zhǔn)備面試。

這一階段又陸陸續(xù)續(xù)做了 100 題,同時(shí)面完了所有的面試,就收工啦。
最后呢,再送個(gè)大家 3 個(gè)很好用的 Github 資料:
按國(guó)內(nèi)公司分類: https://github.com/afatcoder/LeetcodeTop按照算法類型分類: https://github.com/wisdompeak/LeetCodeLeetcode 1-919 題的解析: https://github.com/grandyang/leetcode


