1. 程式人生 > >leetcode 刷500道題,筆試/面試穩過嗎?談一談這些年來演算法的學習

leetcode 刷500道題,筆試/面試穩過嗎?談一談這些年來演算法的學習

想要學習演算法、應付筆試或者應付面試手撕演算法題,相信大部分人都會去刷 Leetcode,有讀者問?如果我在 leetcode 堅持刷它個 500 道題,以後筆試/面試穩嗎?

這裡我說下我的個人看法,我認為不穩。下面說說為啥不穩以及演算法題應該如何刷、如何學才比較好,當然,也會推薦自己學過的資料。

一、先說說筆試題

在刷 leetcode 的時候,你會發現,每道題的題意都很短,你只需要花十幾秒的時間,就知道這道題是要你幹嘛了,並且每道題所用道的演算法思想都很明確,動態規劃、遞迴、二分查詢等,你可能很快就知道該用哪種方法,只是你不懂如何把程式碼寫出來而已。

而在筆試中是完全不一樣的,在筆試中,大部分題目都是情景題,可能讀懂個題目都需要花不少時間,偶爾還會遇到不大知道題目要我們幹嘛,而且有時間限制,估計每道題給你分配的時間是 30 分鐘。這裡我隨便扔一道題給大家看看(Shopee去年的真題)

並且你可能不容易看出來,這些道題該用什麼方法好,有可能是多種方法的結合(當然,不是指這道題哈)。

也就是說,在 leetcode 中,hard 級別的題做的出來,而在筆試中 medium 級別的,由於時間、心態等因素的影響。你可能還做不出來,當然,大佬除外。下面說一說題型的一些題型以及如何學習演算法會好應付點。

在筆試中,我認為主要有如下幾種題型:

1、基本資料結構的考察:這類題我覺得是比較簡單的,主要考場基本資料結構的操作,例如二叉樹的層序遍歷,連結串列的逆序等,當然,它不會直接告訴你,讓你來逆序或者遍歷。例如

2、某種演算法思想的掌握:這類題你掌握了某種演算法思想,就會比較容易,如果不懂,那就涼涼了。例如動態規劃、回溯、列舉、深度/廣度、貪心、二分等。其中,我覺得動態規劃考的挺多,還要就是 回溯+深度/廣度。例如

所以,常見演算法思想,一定要掌握。

3、邊界條件的考察:這型別的題,估計你一看就有思路,知道該怎麼做,但是,它的邊界條件特別多,需要分很多種情況來討論,特別容易出錯,有時候會讓人陷進去,越做越複雜,這類題主要考場你的思維嚴謹程度。例如

4、找規律、數學公式:這型別的題,主要是根據資料之間的一些關係,來找一些規律,進而推出他們的通用公式,就像我們高中時,找數列的同項一樣。例如

二、應該如何刷題?如何學習?

上面說了筆試題的一些情況,也說了主要考察的一些題型。針對這些題型,我覺得在刷題的時候,你要做好下面幾件事。

1、分類歸納/總結

歸納?總結?估計大部分都知道歸納、總結這麼一回事,但是,有沒有去實踐我就不知道了。

(1)、陣列和相關題型

對於演算法題,還是有很多種題型需要去總結的,如果你懂這個題型,以後遇到類似的題,相信很快就能做出來的。有哪些題型可以總結呢?答是非常多:例如

(1)、給你一個非負數的陣列,求最大子陣列和的長度

這算是一個題型,關於這個題型,有很多種變形、拓展,這裡建議一起歸納總結,例如

(2)、剛才給的陣列是非負數的,現在變一下,給的陣列是可正可負。

還能繼續拓展嗎?答是可以的,例如

(3)、給你個矩陣(即二維陣列),求最大子矩陣和的面積

還有嗎?有,例如剛才是求最大和,現在我改成求最大乘積。

我舉上面這些例子,就是想告訴你,對於前期的學習,我建議分類刷題,總結題型,像我上面舉的這些例子,在筆試/面試中還是比較常見的,如果你懂得對應的方法,就可以秒殺了,因為這類題,沒啥邊界或者規律。例如我剛才距離的Shopee的零食櫃那道題,實際上就是陣列切割題型,相當於給你一個數組,讓你切割 n 下,那麼可以把陣列切割成 n + 1 個子陣列,怎麼樣切割,才能讓最大子陣列的和最小?

關於題型的,還是很多的,我這裡無法一一給你列舉,只能靠你刷題的過程中,進行分類、總結。不過我可以給你推薦一些資料,後面推薦哈。下面我在說一些題型吧。

(2)、基本資料結構操作相關題型

剛才我說了,筆試題的考察,有一類題是基本資料結構的考場,而且,這類題在面試中,也是高頻考點,在筆試中,倒不是很高頻。對於這類題,我覺得你願意去總結,那麼以後遇到,問題不大。例如

連結串列的各種操作:逆序(部分逆序、按某種條件逆序)、判斷是否有環,環的入口節點、刪除指定節點等。

二叉樹的各種操作:各種非遞迴的遍歷操作(前中後、層)、二叉樹的公共祖先、根據前中後的遍歷結果來重構二叉樹等等。

佇列、棧相關操作:最小棧、來佇列來實現棧等。

(3)、字串相關問題

不得不說,字串相關問題,估計考的最高頻,而且,我可以告訴你,對於字串相關問題,90% 可以用動態規劃來解決。反正對於字串問題,我一般想法就是能否套用動態規劃,字串問題有點多,不過你有時間,建議總結。例如:萬用字元的匹配、最長公共子串、最小編輯代價、最長迴文串等等。大部分都是用動態規劃,而且,我覺得解法都差不多,所以強烈建議專門花一段時間來做、總結、歸納。後面我也會寫這方面的演算法文章,敬請期待。

2、多思考/動手,提高自己的思維完整性/靈敏性

(1)、邊界、找規律題型

剛才我說有一類題型是邊界特別多的,對於這類題,我覺得不好總結,這類題考察你邏輯是否嚴謹,能否化繁為簡。這裡我建議多做幾道,做的時候,多自己思考,千萬不要覺得自己知道思路,自己怎麼寫,只是情況太多,懶的寫,直接看別人的答案,這樣子,這道題你做了價值不大,因為這類題就是考察你思維完整性的,最好是自己做,可能你用了 十幾個 if 語句,沒關係。接著你可以把你的 if 語句進行化簡,查詢他們的共同點。最後你可以看大佬們的做法,你的收穫會更大!

對了,也千萬別急著動手寫,應該想一想可行性,不然你容易陷入無底深淵。

對於找規律的題型也是一樣,這類題最後別急著看答案,應該多思考,多做幾道,做多了,你的思維會越來越靈敏,以後看到這型別的題,可以很快有思路。

所以,對於這種邊界、規律題,個人感覺總結的價值不是特別大,更多的是多思考,多動手。

注意:每道題,我們都要追求最優解哈,別覺得 ac 了就完事了。

三、我看過的一些資料

上面說了那麼多,可能有人是道理我都懂,可我還是學不會,說實話,學習的方法有很多,每個人的學習方法也都不一樣,我這裡也只是提供一種參考。但是,無論什麼方法,你不去動手執行,那麼,一切都是空話。

這裡我推薦一些我看過的書,感覺挺不錯。

文中涉及到的書籍以及視訊,在我的微信公眾號:苦逼的碼農,回覆『演算法學習』即可獲取

1、書籍推薦

剛才我說了很多種題型,對於按題型刷題總結,首推《程式設計師程式碼面試指南:IT名企演算法與資料結構題目最優解》,這本書真的挺不錯,大部分題型都總結了,而且每個專題有十幾二十道,這裡建議大家買本來學習。

還要一本我大一看的,感覺也挺不錯,叫做《挑戰程式設計大賽》,不過這本比較適合不急著面試的吧,這本不像上面那一本,專門來總結各種題型應付面試。

《程式設計之美》、《程式設計珠璣》也建議看,這兩本我覺得比較有趣,不是說讓你一直刷題一直刷題,這兩本你可以買來看看,會給你帶來一些思路,這兩本我是隻看,沒動手打程式碼。

Leetcode 刷題的時候,也是可以分題型刷滴,所以也可以去 leetcode 刷題,不過刷題的時候,我這裡有個建議,就是別在本地 IDE 寫程式碼,直接在網頁端寫就行了。因為面試的時候,一般就讓你在記事本寫程式碼,不會給你 IDE。如果你不習慣,估計很容易寫錯程式碼,而且,有些庫函式你也把名字忘記了。網頁端其實也是挺方便的,也會有一些程式碼提示。

對於,對於連各種演算法思想、資料結構都還不懂的同學,上面的資料不大合適哈,推薦我看過的兩本書《資料結構與演算法分析 — C 語言描述版》、《演算法設計與分析基礎》(這本程式碼實現是用虛擬碼的)。

2、視訊推薦

說時候,我視訊看的不多,對於演算法的學習,特別是刷題,我是不大習慣看視訊,如果你想看視訊,我覺得牛客網的演算法視訊還不錯吧,我沒過幾集,分初級班和進階班。其他的我也沒看過,所以這裡可以推薦的不多。

四、總結

回到標題,leetcode 刷 500 道題穩嗎?說實話,你能堅持刷 500 道題,說明你的能力還是挺強的,但是對於筆試,我覺得不一定穩,得看你怎麼做,例如是否追求最優解,是否進行總結歸納,還是說你只是暴力 ac 了之後就不理了,或者不敢跳出舒適區,老是做那些比本來就比較擅長的題目,而遇到自己弱的題目,馬上就看答案了。而且我說了,有些題是找規律或者邊界很多的,這類題需要你多思考、動手,不是說我多刷幾道就可以了。

總之,對於刷題,千萬別追求數量!

上面的做題方法,不一定適合每一個人,只是我自己的學習以及建議,供大家參考。想要獲取上面那些資料的,可以在我的公眾號 苦逼的碼農 回覆『演算法學習』即可獲取。

今天是國慶最後一天,大家也玩夠了,所以接下來,就要好好學習了,先把自己的硬實力提升起來。在後面,我也會多寫一些演算法題,例如動態規劃,回溯,遞迴等。

看完有收穫?那麼希望老鐵別吝嗇你的三連擊哦

1、點贊,可以讓更多的人看到這篇文章
2、關注我的原創微信公眾號『苦逼的碼農』,第一時間閱讀我的文章。公眾號後臺回覆『電子書』,還送你一份電子書大禮包哦。
3、也歡迎關注我的部落格哦。

作者簡潔

作者:帥地,一位熱愛、認真寫作的小夥,目前維護原創公眾號:『苦逼的碼農』,以寫了150多篇文章,專注於寫 演算法、計算機基礎知識等提升你內功的文章,期待你的關注。
轉載說明:務必註明來源(註明:來源於公眾號:苦逼的碼農, 作者:帥地)