微軟程序員的算法心得
最近校招也熱熱鬧鬧展開了,有不少讀者問我我那會是怎么刷題學算法的,介于這篇文章是去年寫的,很多讀者沒看過,這次我就舊文重發(fā)一下,并做了相應(yīng)修改,希望對大家有所幫助。
最近也在忙我和同學合作的大廠面試八股文在線開發(fā)。最近實在有點忙,這陣子忙完,就同步一下最近題庫和最近寫的幾篇新八股文。老樣子,大廠近期面試題在線網(wǎng)站奉上。
http://interviewtop.top
求大家給我們的八股文項目github來個贊!https://github.com/autoencoder-github/interviewtop
寫在前面
隨著互聯(lián)網(wǎng)的發(fā)展,各大廠的招聘要求水漲船高。幾年前,做算法題還不是必備項,除了一些知名外企,大部分公司最多臨時在面試中要求寫個鏈表插入、二叉樹遍歷等這種課本上的范例代碼。
但如今由于投身互聯(lián)網(wǎng)的人太多,入職互聯(lián)網(wǎng)公司的門檻水漲船高,國內(nèi)公司向硅谷大廠招聘看齊,開始在面試中加入高水平的編程算法考量。
并且根據(jù)往年經(jīng)驗,互聯(lián)網(wǎng)公司對于算法面試考察的難度和廣度還會隨著時間增長。因此,掌握編程算法能力不僅僅是面試外企所需,更是拿到國內(nèi)互聯(lián)網(wǎng)廠的基本功。
學習編程算法有兩個流派,分別是劍宗和氣宗。許多少俠急于求成,練了劍宗,通過反復刷題提高自己的編程熟練度,再輔以背誦一些代碼模板來達到短時間提高做題能力的目的,但學習到的都是碎片化知識,很容易陷入瓶頸,面對一些有深度或者算法復雜的題目手足無措。
還有一種是氣宗,練劍之前先熟悉自己的武器,也就是編程語言特性、常用的庫函數(shù),還要學習內(nèi)功,也就是各種數(shù)據(jù)結(jié)構(gòu)和常用算法。有了內(nèi)功可以讓你在刷題的時候更好地理解題解,然后做得題目多了也會加深自己的內(nèi)功深度,形成知識體系,面對任何問題都能找到問題核心,然后抽絲剝繭解決題目。
但不是不讓大家練劍宗,如果你的時間有限,很快就面臨招聘季,這時候多刷題效果可能會更好。我這里由于準備得比較早,選擇了氣宗,下面我分享一下我從零開始,編程算法的學習路線,供大家參考。
第一階段(1-2個月)
掌握一門面向?qū)ο笳Z言,能熟悉它的語法規(guī)則和常用包。
以 Java 為例,Java 是一門面向?qū)ο蟮某绦蛘Z言,我在這階段做的工作有:
找一本市面上好評較多的教材熟悉語法規(guī)則,這里我用的是《瘋狂 Java 講義》。 下載 IDE 對著敲一下,鞏固自己對語言的書寫。
在這一部分,很多人就會在意語言的選擇,有的程序員說 PHP 是世界上最好的語言,又有人說人生苦短,我用 Python 。有人學了 C++,又去學了 Python, Go 語言,陷入了語言的學習不能自拔。
在這里我給出自己的一個建議:只要是面向?qū)ο笳Z言,針對算法來說,學一門足矣。
你也可以選擇小眾語言 Go, Rust……只要工具包多,教程多都可以,關(guān)鍵是多練習,熟悉這門語言的語法規(guī)則,這是這階段最重要的事。
第二階段(1-2個月)
熟悉常見數(shù)據(jù)結(jié)構(gòu),并且熟悉這個數(shù)據(jù)結(jié)構(gòu)在你的語言中的使用規(guī)則。
以 Java 為例,相當多的數(shù)據(jù)結(jié)構(gòu)在 Java 的 collection 框架下,我在這個階段做的工作有:
找一個市面上較好的教程入門,這里我采用的是慕課網(wǎng)《算法與數(shù)據(jù)結(jié)構(gòu)-綜合提升 C++版》視頻,由于他采用的語言是C++,我在他的基礎(chǔ)上對照著寫了個Java版本。 了解自己熟悉語言的常見數(shù)據(jù)結(jié)構(gòu)使用,包括了解二叉樹,字典樹,哈希表,集合,并查集等等的基本概念。
這一階段,重點在數(shù)據(jù)結(jié)構(gòu)的學習。需要重點掌握的數(shù)據(jù)結(jié)構(gòu)有:鏈表、哈希表、集合、棧、隊列、堆、二叉樹、二叉搜索樹、圖。 這部分需要做到時間空間復雜度,性質(zhì),了如指掌。
其次掌握并查集、字典樹,這部分會寫就行。最后稍作了解 B 樹,B+ 樹,紅黑樹,AVL 樹,知道他們的定義和概念即可。
第三階段(1個月左右)
我們在前兩階段的學習中,已經(jīng)熟悉了語言語法規(guī)則,常見數(shù)據(jù)結(jié)構(gòu),為后續(xù)的算法打下了基礎(chǔ)。
這一階段我們需要熟悉常見的算法,如 DFS、BFS、DP、各種排序算法等等,并在你使用的語言中加以練習。
以 Java 為例,我采用的學習方法是:
找一本算法書入門,這里推薦 Robert Sedgewick 寫的《算法(第四版)》,并且這本書中包含的范例,編程語言都是 Java 。 找一個系統(tǒng)性的算法學習視頻進行學習,這里推薦《算法(第四版)》配套視頻, Coursera 上可看, bilibili上 有搬運版本。
這一階段,由于很多知識點會在第二部分學過了。所以這部分的重點在于針對各個算法有一個系統(tǒng)性,體系性的了解。
如果大家不喜歡《算法(第四版)》的風格,推薦大家看一下《大話數(shù)據(jù)結(jié)構(gòu)與算法》。其中《算法(第四版)》課后題大家可以不做,對他講述的內(nèi)容理解即可。
第四階段(1-2個月)
在前三個階段的學習中,我們了解了常見的數(shù)據(jù)結(jié)構(gòu)和算法,并針對算法進行了系統(tǒng)學習,接下來就可以開始我們的刷題之旅了。
這里推薦的資料有:
慕課網(wǎng) liuyubobobo 《玩轉(zhuǎn)算法面試-- Leetcode真題分門別類講解》針對他所列舉的例題和作業(yè)題,進行練習。
這一階段,我們終于進入了刷題環(huán)節(jié),大家記得注冊 leetcode 力扣網(wǎng)賬戶,然后開始自己的刷題之旅吧!
第五階段(2-3個月)
這一階段希望大家多刷題,達到見多識廣的地步。
這里推薦兩本書:
《劍指offer》這本書大名鼎鼎,不用多說。書上的題目在 leetcode 網(wǎng)站上也可以刷。 《程序員代碼面試指南》這本書羅列的題目也很不錯,牛客網(wǎng)可刷。
這個階段希望大家多做題,多見新題。 這樣的話在見新題的過程中做個整理,慢慢的,大家就會發(fā)現(xiàn)很多題就是新瓶裝舊酒了。
第六階段(1個月以上)
這一階段的目的是熟能生巧,多刷好題,經(jīng)典題。
這里推薦的刷題范圍是:
leetcode hot 100,hot100 leetcode 精選top面試題 《劍指offer》
這階段的關(guān)鍵點在于多刷,刷遍數(shù)。 這個就像背單詞一樣,多做幾遍,對常見題的理解和他的衍生題,都會有一個爛熟于心的程度。針對我這邊列舉的題單,做到見題目,秒想思路。
但是大家也不用太苛求,有幾個 hard 題的 corner case 比較難寫,大家思路對就行。
第七階段
進階高級算法。這部分其實如果不是面試 Google 這種公司,完成第六階段的學習就ok了。如果還想繼續(xù)精進,可以參考書籍:
《挑戰(zhàn)程序設(shè)計競賽》這本書寫得極好,無論是列舉的習題還是例題都值得反復玩味。 各大OJ平臺刷題。
各位大俠在完成這階段的學習之后,可以去打打程序設(shè)計競賽,挑戰(zhàn)自我,精進功力。
寫在最后
學習算法關(guān)鍵是堅持,按這套流程走下來,相信大家能順利通過各大廠互聯(lián)網(wǎng)筆試了。
我個人在 leetcode 上做的題一共是450題,算上二刷,三刷的題一共1k+左右。
雖然看起來數(shù)字挺多,其實按每天三題算,也就一年而已。
無論是校招小伙伴還是社招的朋友,堅持刷題,總會有收獲。祝大家早日拿到理想的 Offer!
