漫畫:小白為了面試如何刷題?(嘔心瀝血算法指導(dǎo)篇)
來自:小浩算法
三年高考,五年刷題。leetcode不算從其他各處收錄的題目,單就自己的題庫,總共有1600+,如果按照每天刷一道的話,總共需要5年。那我們真的需要把這些題目全部刷完嗎?如果不是,刷多少合適?又該怎么刷呢?本文我盡量言簡意賅,直擊大家的疑惑。(本文適合算法初學(xué)者)
不下百人問過我這個(gè)問題。我的建議是,對(duì)于大部分的人,200道是一個(gè)合適的數(shù)字。
估計(jì)到這里,有人會(huì)噴我。你不設(shè)前提,不談目的,直接就說200道,這不是扯淡嗎。我想說的是,這不是扯淡。
前面我已經(jīng)說了,對(duì)于大部分人,我的建議是200道。大部分人指的是什么呢?我這里統(tǒng)指沒有系統(tǒng)刷題經(jīng)驗(yàn)的同學(xué)。無論是工作3-5年的職場老司機(jī),還是即將畢業(yè)的應(yīng)屆生,只要沒怎么刷過題,通通歸為此類。
對(duì)于上面這個(gè)群體(請(qǐng)先自行判斷是否可以歸為此類),刷題的目的基本是為了面試。不管我多么巧舌如簧,告訴你算法可以提高思維,增強(qiáng)邏輯,是成為top coder的必然條件,等等等等。但最終都還是會(huì)回歸到這個(gè)目的:面試。
所以現(xiàn)在我們換掉問題:沒什么刷題經(jīng)驗(yàn)的同學(xué)為了面試需要刷多少道題?我的答案是:200道。
這個(gè)問題,不妨換做 ”刷完200道題可以掌握到什么程度?“
常見tag無外乎那么七八種,200道題聽起來很多,但是分散到每一個(gè)tag,每種也就只包含二三十個(gè)。倘若我們算多點(diǎn),每一個(gè)tag包含30道題,其中大概是15-20道easy,5-10道medium,2-3道hard。200道不多不少,基本可以完美覆蓋整個(gè)算法體系,所以我認(rèn)為200道是一個(gè)不錯(cuò)的數(shù)字。
那么回到問題 “刷完200道題可以掌握到什么程度?” 我當(dāng)然可以給你一些信心,告訴你200道題可以讓你吊打面試官,完虐BAT。但是呢,其實(shí)這都是騙小孩子的,或者就是騙 ¥。那真實(shí)的200道題能讓你到達(dá)一個(gè)什么程度呢?
在算法方面超過大概80%的同行(這里單指基礎(chǔ)算法,非ML、AI等)
在面試時(shí)不至于對(duì)方拿出一道題目整個(gè)人就陷入懵逼,而是有資格享受面試思考題目的過程
身邊有朋友聊到算法敢過去和他們交流,而不是默默的走開
對(duì)于應(yīng)屆生,謀取一份拿到offer的可能性
對(duì)于老司機(jī),去大廠鍍金的必備條件
對(duì)于培訓(xùn)生,極大的縮小和科班學(xué)生的差距
“我之前立了個(gè)flag,一天刷一道都沒堅(jiān)持下來。你特么讓我刷兩百道,我一年都搞不定。這不扯淡嗎?”
如果你有上面的疑惑,那么:你錯(cuò)了。堅(jiān)持不下來一天一道的人和刷完200道題,毛關(guān)系都沒有?;氐轿疑厦娴睦樱?00道題目里。大概easy在130-150道左右,medium在30-50道,hard只占據(jù)了不到20道題。
(you, wrong)
跑步和刷題不同。跑步是越來越慢,刷題卻是越來越快的。對(duì)于初學(xué)者(正常人),在每一個(gè)tag刷了10道左右簡單題之后,基本同類型的題目可以提高到每天2-3道easy題目,有的掌握好的,甚至能提高到每天刷5-10題。很多同類型題目,基本都是一個(gè)模子刻出來的。
所以我認(rèn)為,200道題刷的特別慢的話大概在150天左右完成,中不溜的在100天左右,刷的快的話在60天左右。同時(shí),如果我們再把這里邊的 medium 和 hard 通通remove 掉。再不濟(jì),也應(yīng)該在3個(gè)月左右掌握大概100-150道簡單題目。剩下的,just do it。
你忘我也忘,大家都旺旺。
忘就對(duì)了。如果你在刷題的時(shí)候發(fā)現(xiàn)怎么也寫不出來,別擔(dān)心,這是正常的。如果你還發(fā)現(xiàn),之前明明刷過的題,過段時(shí)間再做的時(shí)候,自己還是不會(huì)。別擔(dān)心,這特么還是正常的。
作為一個(gè)正常人,大腦就會(huì)忘記,如果不忘,可能說明你大腦出了問題。這個(gè)不是我說的,是醫(yī)生說的:
所以如果有些題你刷了好多遍都還是不會(huì),那就需要進(jìn)行總結(jié)。思考到底是哪一環(huán)節(jié)卡住了你,反復(fù)進(jìn)行練習(xí)。當(dāng)然,這里有人建議是每道題都刷個(gè)3遍,其實(shí)我覺得倒是沒有這個(gè)必要。我建議是找個(gè)小本本,記一下每一道的核心要素與考察要點(diǎn)。在刷題的這段時(shí)間里,沒啥事就瞅瞅翻翻。
我沒學(xué)過算法和數(shù)據(jù)結(jié)構(gòu),能不能刷題?
能。刷題本身就是一個(gè)學(xué)習(xí)的過程。比如二叉樹的題,刷個(gè)30道,你一定會(huì)遇到BST。所以我個(gè)人認(rèn)為學(xué)習(xí)系統(tǒng)的算法知識(shí)(也就是你們問我的,要不要買一本書,先看一遍再進(jìn)行刷題)和 刷題 本身并不矛盾。你可以雙管齊下,也可以單點(diǎn)突破,都o(jì)k。主要是,干就對(duì)了。
到這里就會(huì)出現(xiàn)另一個(gè)問題,“我是從頭刷,還是分類刷?” 我的建議是,如果稍微有點(diǎn)算法基礎(chǔ),你就從頭刷leetcode前200道題。如果完全沒有算法基礎(chǔ),可以考慮分tag來刷。并不是說按照tag的方式更好,而是在沒有算法基礎(chǔ)的前提下分tag來刷,除了掌握題型之外,對(duì)于知識(shí)的掌握很有益處。(想一想初高中是如何學(xué)習(xí)的)那為什么又說從頭刷也是可以的?這個(gè)是因?yàn)?,如果一直刷某一種類型的題,容易出現(xiàn)刷完一類忘掉前一類的問題,也容易對(duì)某一類題目疲憊??傊?strong>使用哪種方式取決于你。關(guān)鍵是:干就對(duì)了!
另外,我認(rèn)為leetcode前200題是相當(dāng)經(jīng)典的??赡艽蠹也恢?,早期leetcode總共也就一百來道題。這些題目基本都是精華,后面的很多題目都是在這些題目的基礎(chǔ)上進(jìn)行演化而成。比如 合并兩個(gè)有序鏈表,后來就演化成 合并K個(gè)有序鏈表。并且前200道題基本覆蓋了所有的算法類型,我是很建議大家刷一遍的。
初學(xué)者拿到題目沒有思路怎么辦?為什么看完題解自己還是寫不出來?別人的代碼為什么可以那么簡單?為了面試要不要盡可能多的掌握最優(yōu)解?等等等等,這些我打算出在下一次的算法指導(dǎo)篇中。
特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:
長按訂閱更多精彩▼
如有收獲,點(diǎn)個(gè)在看,誠摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請(qǐng)聯(lián)系我們,謝謝!