學(xué)習(xí)目錄

讀者經(jīng)常讓我寫刷題路線,我覺得這些東西太枯燥了,今天就編一個故事講講。

這要從小東開始學(xué)習(xí)技術(shù)開始講起。

小東是一個目標(biāo)明確的人,自從上了大學(xué)就在琢磨怎么才能找高薪工作多賺錢。他發(fā)現(xiàn)做程序員工資挺高,而且有大量優(yōu)秀的 在線練習(xí)平臺,所以毅然決定入坑。

計算機的幾大基礎(chǔ),Linux 操作系統(tǒng)當(dāng)然是必知必會的啦!小東在他的老年機上安裝了 Ubuntu,對于小白,最讓人疑惑的就是 Linux 文件系統(tǒng) 了。至于命令行終端,只要了解一些 Linux Shell 的常識常用的 Linux 效率技巧 就能日常使用 Linux 系統(tǒng)啦。

當(dāng)然,作為一個愛刨根問底的同學(xué),小東還研究了 Linux 源碼,搞清了 Linux 進程/線程和文件描述符是什么,這對他后來的面試幫助很大哦。

除了操作系統(tǒng),計算機網(wǎng)絡(luò)當(dāng)然也是非常重要的,小東不想直接去啃大部頭,先搞清了 HTTP 協(xié)議的 cookie 和 session 機制 和保證 HTTP 安全的各種 加密算法技術(shù),這在他后來的面試中也被問到了無數(shù)次,果然是有備無患啊。

小東平時也會寫寫代碼,做個小項目之類的,覺得自己相比其他同學(xué)已經(jīng)有所小成,有點驕傲了,直到有一天他接觸了數(shù)據(jù)結(jié)構(gòu)和算法

小東是按照學(xué)校的課本學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)和算法,但是他覺得實在太難了,代碼全是 C 語言寫的,晦澀難懂,而且開篇就上各大排序算法,第二篇講 KMP 算法,然后課后習(xí)題就是讓你 實現(xiàn)一個計算器程序 或者讓你 計算排列、組合、子集 等等。

小東人傻了,決定提前預(yù)習(xí)這門課,奮發(fā)圖強連學(xué)了一周,把書上的代碼都敲了一遍。等到開學(xué),哦吼,全忘了。

小東還從學(xué)長那里聽說,想進大廠,算法得好,于是開始刷 LeetCode。這下更傻眼了,這些題都是什么妖魔鬼怪?為什么要求我 用棧實現(xiàn)隊列,用隊列實現(xiàn)棧?還有 單調(diào)棧、單調(diào)隊列 怎么聽都沒聽過?

PS:我認真寫了 100 多篇原創(chuàng),手把手刷 200 道力扣題目,全部發(fā)布在 labuladong的算法小抄,持續(xù)更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了。

名師指點

所幸的是,小東遇到一位神棍老師,我們不妨稱他為 dong 老師,dong 老師第一節(jié)課就拿著學(xué)校的數(shù)據(jù)結(jié)構(gòu)教材說:

這本書 300 多頁,99% 都是注水內(nèi)容,XXX 先生也沒辦法,真正的干貨最多 5 頁就寫完了,要是不注注水多寫幾頁,出版社估計不給他出版。所以同學(xué)們學(xué)聰明點,要有 學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的框架思維

全班哄堂大笑,小東撇了撇嘴:各位還擱這笑呢,等你們被算法暴打了就笑不出來了。

dong 老師整個學(xué)期似乎一直在講二叉樹,小東為了在課上裝逼,課后就偷偷去 LeetCode 刷二叉樹的題,為了搞清 二叉樹的最近公共祖先,在紙上畫算法遞歸的過程畫到大半夜,還是有點懵懵懂懂。

第二天上課,dong 老師問班長今天有多少同學(xué)來上課。

班長開始數(shù)人數(shù),dong 老師表示很不滿:如果你告訴我,總?cè)藬?shù)是一個人加上剩下的人,我就知道你的算法學(xué)得很好了。

然后 dong 老師問大家誰會寫 二叉搜索樹的增刪查改,小東昨晚才在力扣的「探索」專題把二叉搜索樹系列刷完,于是自告奮勇上臺裝逼,把增刪查改算法全寫了。

dong 老師點點頭,對全班同學(xué)說:

小東同學(xué)寫的都對,100 分。但是如果你實在寫不出來,就把框架寫出來,我就知道你懂了,雖然細節(jié)你寫不出來,但是框架是對的,只要框架存于心,起碼你能寫出一個錯誤的程序,這就值 80 分。

// dong 老師說的框架
void traverse(TreeNode root) {
    traverse(root.left);
    traverse(root.right);
}

小東覺得 dong 老師實在是太神棍了,但是他說得好像又有些道理,昨天做的 二叉樹的最近公共祖先扁平化嵌套列表 似乎都沒有逃出這幾行代碼。于是小東回去做了 二叉樹的前中后序遍歷框架一系列二叉樹問題,好像突然明白了點什么。

這一天,小東悟了!

這學(xué)期很快接近尾聲,小東在期末考試中成功解決了 遞歸翻轉(zhuǎn)鏈表的一部分K 個一組翻轉(zhuǎn)鏈表 兩道大題,獲得了很不錯的成績。

PS:我認真寫了 100 多篇原創(chuàng),手把手刷 200 道力扣題目,全部發(fā)布在 labuladong的算法小抄,持續(xù)更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了。

數(shù)據(jù)結(jié)構(gòu)進階

dong 老師教的更多的是「道」,框架只是一種方向,想要真正把數(shù)據(jù)結(jié)構(gòu)運用自如,還是要自己下功夫才行。

小東嘗試去看過《算法導(dǎo)論》,如果說學(xué)校的教材大部分都是注水內(nèi)容,《算法導(dǎo)論》實在是太干了,跟尼瑪磚頭一樣,實在是啃不動。

于是小東就去看了鼎鼎有名的《算法4》,上來就被 union-find 算法詳解 吸引了,又去力扣上嘗試把 union-find 算法應(yīng)用 出來,不由得拍案叫絕,原來算法還能這么玩?學(xué)算法最好的書是什么?不要問,問就是《算法4》。

那年寒假,小東一個人窩在寒冷的宿舍,花了一個多月把《算法4》的所有代碼都親自敲了一遍,包括紅黑樹這種神一樣的數(shù)據(jù)結(jié)構(gòu),在二叉樹框架之下都變得有跡可循了。

在書中學(xué)了字典樹(Trie)之后,小東立即去力扣的「探索」專欄刷掉了字典樹專欄,感覺很信心爆棚,突發(fā)奇想:我學(xué)了那么多種「樹」,力扣不是有二叉樹標(biāo)簽的題目嗎?要不干一票?

那一天,小東只睡了 5 個小時,提交了 300 多次,把 100 多道二叉樹題目全部 AC。一瞬間,宿舍的寒冷和獨處的孤獨都不算什么了,小東感覺自己無所不能,可以原地上天了。

題海刷題

但是,小東發(fā)現(xiàn)現(xiàn)實和自己以為的還是有差距,二叉樹相關(guān)的題其實培養(yǎng)的是一種遞歸思維,但是如何運用出來,得多練,沒有捷徑。真正面對力扣的海量題目,還是感覺無從下手。

所幸小東是個非常雞賊的人,懂得通過結(jié)果反推方向,把時間花在刀刃上,絕不做沒有結(jié)果的事。

小東去??途W(wǎng)調(diào)研了各個大廠往年筆試考的算法題目,發(fā)現(xiàn)大廠筆試題主要集中在以下幾個方面(按出現(xiàn)頻率排序):

1、窮舉類題目。

2、技巧類題目。

3、基本數(shù)據(jù)結(jié)構(gòu)類題目。

4、數(shù)學(xué)類題目。

面試的時候考察的算法就比較簡單了,大部分都是基本數(shù)據(jù)結(jié)構(gòu)的題,難一點的就是設(shè)計題了,比如讓你 手寫 LRU 算法,手寫 LFU 算法 或者設(shè)計一個 Twitter 時間線功能。

小東并沒有按照動態(tài)規(guī)劃、回溯算法這種方式對題目進行分類,因為它們都屬于

所以說,關(guān)鍵還是動歸、回溯、字符串系列的題目需要針對性練習(xí)一下,至于類似 階乘相關(guān)題目水塘抽樣算法篩數(shù)法快速計算素數(shù) 這樣的數(shù)學(xué)題,出現(xiàn)的概率不大,掌握一些基本的就行了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容