首頁>技術>

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

這要從小東開始學習技術開始講起。

小東是一個目標明確的人,自從上了大學就在琢磨怎麼才能找高薪工作多賺錢。他發現做程式設計師工資挺高,而且有大量優秀的 線上練習平臺,所以毅然決定入坑。

計算機的幾大基礎,Linux 作業系統當然是必知必會的啦!小東在他的老年機上安裝了 Ubuntu,對於小白,最讓人疑惑的就是 Linux 檔案系統 了。至於命令列終端,只要瞭解一些 Linux Shell 的常識 和 常用的 Linux 效率技巧 就能日常使用 Linux 系統啦。

當然,作為一個愛刨根問底的同學,小東還研究了 Linux 原始碼,搞清了 Linux 程序/執行緒和檔案描述符是什麼,這對他後來的面試幫助很大哦。

除了作業系統,計算機網路當然也是非常重要的,小東不想直接去啃大部頭,先搞清了 HTTP 協議的 cookie 和 session 機制 和保證 HTTP 安全的各種 加密演算法技術,這在他後來的面試中也被問到了無數次,果然是有備無患啊。

小東平時也會寫寫程式碼,做個小專案之類的,覺得自己相比其他同學已經有所小成,有點驕傲了,直到有一天他接觸了資料結構和演算法

小東是按照學校的課本學習的資料結構和演算法,但是他覺得實在太難了,程式碼全是 C 語言寫的,晦澀難懂,而且開篇就上各大排序演算法,第二篇講 KMP 演算法,然後課後習題就是讓你 實現一個計算器程式 或者讓你 計算排列、組合、子集 等等。

小東人傻了,決定提前預習這門課,奮發圖強連學了一週,把書上的程式碼都敲了一遍。等到開學,哦吼,全忘了。

小東還從學長那裡聽說,想進大廠,演算法得好,於是開始刷 LeetCode。這下更傻眼了,這些題都是什麼妖魔鬼怪?為什麼要求我 用棧實現佇列,用佇列實現棧?還有 單調棧、單調佇列 怎麼聽都沒聽過?

名師指點

所幸的是,小東遇到一位神棍老師,我們不妨稱他為 dong 老師,dong 老師第一節課就拿著學校的資料結構教材說:

這本書 300 多頁,99% 都是注水內容,XXX 先生也沒辦法,真正的乾貨最多 5 頁就寫完了,要是不注注水多寫幾頁,出版社估計不給他出版。所以同學們學聰明點,要有 學習資料結構和演算法的框架思維。

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

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

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

班長開始數人數,dong 老師表示很不滿:如果你告訴我,總人數是一個人加上剩下的人,我就知道你的演算法學得很好了。

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

dong 老師點點頭,對全班同學說:

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

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

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

這一天,小東悟了!

這學期很快接近尾聲,小東在期末考試中成功解決了 遞迴翻轉連結串列的一部分 和 K 個一組翻轉連結串列 兩道大題,獲得了很不錯的成績。

資料結構進階

dong 老師教的更多的是「道」,框架只是一種方向,想要真正把資料結構運用自如,還是要自己下功夫才行。

小東嘗試去看過《演算法導論》,如果說學校的教材大部分都是注水內容,《演算法導論》實在是太乾了,跟尼瑪磚頭一樣,實在是啃不動。

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

那年寒假,小東一個人窩在寒冷的宿舍,花了一個多月把《演算法4》的所有程式碼都親自敲了一遍,包括紅黑樹這種神一樣的資料結構,在二叉樹框架之下都變得有跡可循了。

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

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

題海刷題

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

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

小東去牛客網調研了各個大廠往年筆試考的演算法題目,發現大廠筆試題主要集中在以下幾個方面(按出現頻率排序):

1、窮舉類題目

2、技巧類題目

3、基本資料結構類題目

4、數學類題目

面試的時候考察的演算法就比較簡單了,大部分都是基本資料結構的題,難一點的就是設計題了,比如讓你 手寫 LRU 演算法,手寫 LFU 演算法 或者設計一個 Twitter 時間線功能。

小東並沒有按照動態規劃、回溯演算法這種方式對題目進行分類,因為它們都屬於

所以說,關鍵還是動歸、回溯、字串系列的題目需要針對性練習一下,至於類似 階乘相關題目,水塘抽樣演算法 和 篩數法快速計算素數 這樣的數學題,出現的機率不大,掌握一些基本的就行了。

13
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 51微控制器程式設計軟體keil_V5