leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习
來源公眾號:苦逼的碼農(nóng)
作者:帥地
想要學習算法、應(yīng)付筆試或者應(yīng)付面試手撕算法題,相信大部分人都會去刷 Leetcode,有讀者問?如果我在 leetcode 堅持刷它個 500 道題,以后筆試/面試穩(wěn)嗎?
這里我說下我的個人看法,我認為不穩(wěn)。下面說說為啥不穩(wěn)以及算法題應(yīng)該如何刷、如何學才比較好,當然,也會推薦自己學過的資料。
一、先說說筆試題
在刷 leetcode 的時候,你會發(fā)現(xiàn),每道題的題意都很短,你只需要花十幾秒的時間,就知道這道題是要你干嘛了,并且每道題所用道的算法思想都很明確,動態(tài)規(guī)劃、遞歸、二分查找等,你可能很快就知道該用哪種方法,只是你不懂如何把代碼寫出來而已。
而在筆試中是完全不一樣的,在筆試中,大部分題目都是情景題,可能讀懂個題目都需要花不少時間,偶爾還會遇到不大知道題目要我們干嘛,而且有時間限制,估計每道題給你分配的時間是 30 分鐘。這里我隨便扔一道題給大家看看(Shopee去年的真題)
并且你可能不容易看出來,這些道題該用什么方法好,有可能是多種方法的結(jié)合(當然,不是指這道題哈)。
也就是說,在 leetcode 中,hard 級別的題做的出來,而在筆試中 medium 級別的,由于時間、心態(tài)等因素的影響。你可能還做不出來,當然,大佬除外。下面說一說題型的一些題型以及如何學習算法會好應(yīng)付點。
在筆試中,我認為主要有如下幾種題型:
1、基本數(shù)據(jù)結(jié)構(gòu)的考察:這類題我覺得是比較簡單的,主要考場基本數(shù)據(jù)結(jié)構(gòu)的操作,例如二叉樹的層序遍歷,鏈表的逆序等,當然,它不會直接告訴你,讓你來逆序或者遍歷。例如
2、某種算法思想的掌握:這類題你掌握了某種算法思想,就會比較容易,如果不懂,那就涼涼了。例如動態(tài)規(guī)劃、回溯、枚舉、深度/廣度、貪心、二分等。其中,我覺得動態(tài)規(guī)劃考的挺多,還要就是 回溯+深度/廣度。例如
所以,常見算法思想,一定要掌握。3、邊界條件的考察:這類型的題,估計你一看就有思路,知道該怎么做,但是,它的邊界條件特別多,需要分很多種情況來討論,特別容易出錯,有時候會讓人陷進去,越做越復雜,這類題主要考場你的思維嚴謹程度。例如
4、找規(guī)律、數(shù)學公式:這類型的題,主要是根據(jù)數(shù)據(jù)之間的一些關(guān)系,來找一些規(guī)律,進而推出他們的通用公式,就像我們高中時,找數(shù)列的同項一樣。例如
二、應(yīng)該如何刷題?如何學習?
上面說了筆試題的一些情況,也說了主要考察的一些題型。針對這些題型,我覺得在刷題的時候,你要做好下面幾件事。
1、分類歸納/總結(jié)
歸納?總結(jié)?估計大部分都知道歸納、總結(jié)這么一回事,但是,有沒有去實踐我就不知道了。
(1)、數(shù)組和相關(guān)題型
對于算法題,還是有很多種題型需要去總結(jié)的,如果你懂這個題型,以后遇到類似的題,相信很快就能做出來的。有哪些題型可以總結(jié)呢?答是非常多:例如
(1)、給你一個非負數(shù)的數(shù)組,求最大子數(shù)組和的長度
這算是一個題型,關(guān)于這個題型,有很多種變形、拓展,這里建議一起歸納總結(jié),例如
(2)、剛才給的數(shù)組是非負數(shù)的,現(xiàn)在變一下,給的數(shù)組是可正可負。
還能繼續(xù)拓展嗎?答是可以的,例如
(3)、給你個矩陣(即二維數(shù)組),求最大子矩陣和的面積
還有嗎?有,例如剛才是求最大和,現(xiàn)在我改成求最大乘積。
我舉上面這些例子,就是想告訴你,對于前期的學習,我建議分類刷題,總結(jié)題型,像我上面舉的這些例子,在筆試/面試中還是比較常見的,如果你懂得對應(yīng)的方法,就可以秒殺了,因為這類題,沒啥邊界或者規(guī)律。例如我剛才距離的Shopee的零食柜那道題,實際上就是數(shù)組切割題型,相當于給你一個數(shù)組,讓你切割 n 下,那么可以把數(shù)組切割成 n + 1 個子數(shù)組,怎么樣切割,才能讓最大子數(shù)組的和最小?
關(guān)于題型的,還是很多的,我這里無法一一給你列舉,只能靠你刷題的過程中,進行分類、總結(jié)。不過我可以給你推薦一些資料,后面推薦哈。下面我在說一些題型吧。
(2)、基本數(shù)據(jù)結(jié)構(gòu)操作相關(guān)題型
剛才我說了,筆試題的考察,有一類題是基本數(shù)據(jù)結(jié)構(gòu)的考場,而且,這類題在面試中,也是高頻考點,在筆試中,倒不是很高頻。對于這類題,我覺得你愿意去總結(jié),那么以后遇到,問題不大。例如
鏈表的各種操作:逆序(部分逆序、按某種條件逆序)、判斷是否有環(huán),環(huán)的入口節(jié)點、刪除指定節(jié)點等。
二叉樹的各種操作:各種非遞歸的遍歷操作(前中后、層)、二叉樹的公共祖先、根據(jù)前中后的遍歷結(jié)果來重構(gòu)二叉樹等等。
隊列、棧相關(guān)操作:最小棧、來隊列來實現(xiàn)棧等。
(3)、字符串相關(guān)問題
不得不說,字符串相關(guān)問題,估計考的最高頻,而且,我可以告訴你,對于字符串相關(guān)問題,90% 可以用動態(tài)規(guī)劃來解決。反正對于字符串問題,我一般想法就是能否套用動態(tài)規(guī)劃,字符串問題有點多,不過你有時間,建議總結(jié)。例如:通配符的匹配、最長公共子串、最小編輯代價、最長回文串等等。大部分都是用動態(tài)規(guī)劃,而且,我覺得解法都差不多,所以強烈建議專門花一段時間來做、總結(jié)、歸納。后面我也會寫這方面的算法文章,敬請期待。
2、多思考/動手,提高自己的思維完整性/靈敏性
(1)、邊界、找規(guī)律題型
剛才我說有一類題型是邊界特別多的,對于這類題,我覺得不好總結(jié),這類題考察你邏輯是否嚴謹,能否化繁為簡。這里我建議多做幾道,做的時候,多自己思考,千萬不要覺得自己知道思路,自己怎么寫,只是情況太多,懶的寫,直接看別人的答案,這樣子,這道題你做了價值不大,因為這類題就是考察你思維完整性的,最好是自己做,可能你用了 十幾個 if 語句,沒關(guān)系。接著你可以把你的 if ?語句進行化簡,查找他們的共同點。最后你可以看大佬們的做法,你的收獲會更大!
對了,也千萬別急著動手寫,應(yīng)該想一想可行性,不然你容易陷入無底深淵。
對于找規(guī)律的題型也是一樣,這類題最后別急著看答案,應(yīng)該多思考,多做幾道,做多了,你的思維會越來越靈敏,以后看到這類型的題,可以很快有思路。
所以,對于這種邊界、規(guī)律題,個人感覺總結(jié)的價值不是特別大,更多的是多思考,多動手。
注意:每道題,我們都要追求最優(yōu)解哈,別覺得 ac 了就完事了。
三、我看過的一些資料
上面說了那么多,可能有人是道理我都懂,可我還是學不會,說實話,學習的方法有很多,每個人的學習方法也都不一樣,我這里也只是提供一種參考。但是,無論什么方法,你不去動手執(zhí)行,那么,一切都是空話。
這里我推薦一些我看過的書,感覺挺不錯。
文中涉及到的書籍以及視頻,在我的微信公眾號『苦逼的碼農(nóng)』回復『算法學習』即可獲取
1、書籍推薦
剛才我說了很多種題型,對于按題型刷題總結(jié),首推《程序員代碼面試指南:IT名企算法與數(shù)據(jù)結(jié)構(gòu)題目最優(yōu)解》,這本書真的挺不錯,大部分題型都總結(jié)了,而且每個專題有十幾二十道,這里建議大家買本來學習。
還要一本我大一看的,感覺也挺不錯,叫做《挑戰(zhàn)程序設(shè)計大賽》,不過這本比較適合不急著面試的吧,這本不像上面那一本,專門來總結(jié)各種題型應(yīng)付面試。
《編程之美》、《編程珠璣》也建議看,這兩本我覺得比較有趣,不是說讓你一直刷題一直刷題,這兩本你可以買來看看,會給你帶來一些思路,這兩本我是只看,沒動手打代碼。
Leetcode 刷題的時候,也是可以分題型刷滴,所以也可以去 leetcode 刷題,不過刷題的時候,我這里有個建議,就是別在本地 IDE 寫代碼,直接在網(wǎng)頁端寫就行了。因為面試的時候,一般就讓你在記事本寫代碼,不會給你 IDE。如果你不習慣,估計很容易寫錯代碼,而且,有些庫函數(shù)你也把名字忘記了。網(wǎng)頁端其實也是挺方便的,也會有一些代碼提示。
對于,對于連各種算法思想、數(shù)據(jù)結(jié)構(gòu)都還不懂的同學,上面的數(shù)據(jù)不大合適哈,推薦我看過的兩本書《數(shù)據(jù)結(jié)構(gòu)與算法分析 — C 語言描述版》、《算法設(shè)計與分析基礎(chǔ)》(這本代碼實現(xiàn)是用偽代碼的)。
2、視頻推薦
說時候,我視頻看的不多,對于算法的學習,特別是刷題,我是不大習慣看視頻,如果你想看視頻,我覺得牛客網(wǎng)的算法視頻還不錯吧,我沒過幾集,分初級班和進階班。其他的我也沒看過,所以這里可以推薦的不多。
四、總結(jié)
回到標題,leetcode 刷 500 道題穩(wěn)嗎?說實話,你能堅持刷 500 道題,說明你的能力還是挺強的,但是對于筆試,我覺得不一定穩(wěn),得看你怎么做,例如是否追求最優(yōu)解,是否進行總結(jié)歸納,還是說你只是暴力 ac 了之后就不理了,或者不敢跳出舒適區(qū),老是做那些比本來就比較擅長的題目,而遇到自己弱的題目,馬上就看答案了。而且我說了,有些題是找規(guī)律或者邊界很多的,這類題需要你多思考、動手,不是說我多刷幾道就可以了。
總之,對于刷題,千萬別追求數(shù)量!
上面的做題方法,不一定適合每一個人,只是我自己的學習以及建議,供大家參考。想要獲取上面那些資料的,可以在我的公眾號『苦逼的碼農(nóng)』回復『算法學習』即可獲取。
今天是假期最后一天,大家也玩夠了,所以接下來,就要好好學習了,先把自己的硬實力提升起來。在后面,我也會多寫一些算法題,例如動態(tài)規(guī)劃,回溯,遞歸等。
推薦閱讀
總結(jié)
以上是生活随笔為你收集整理的leetcode 刷500道题,笔试/面试稳吗?谈谈算法的学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MSN无法登陆错误汇总
- 下一篇: 收藏100个网络基础知识