10.12 leetcode 刷500道題,筆試

leetcode 刷500道題,筆試/面試到底穩不穩

作者 | 帥地

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

這裡我說下我的個人看法,我認為不穩。下面說說為啥不穩以及算法題應該如何刷、如何學才比較好。

一、先說說筆試題

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

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

leetcode 刷500道题,笔试/面试到底稳不稳

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

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

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

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

leetcode 刷500道题,笔试/面试到底稳不稳

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

leetcode 刷500道题,笔试/面试到底稳不稳

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

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

leetcode 刷500道题,笔试/面试到底稳不稳

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

leetcode 刷500道题,笔试/面试到底稳不稳

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

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

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 了之後就不理了,或者不敢跳出舒適區,老是做那些比本來就比較擅長的題目,而遇到自己弱的題目,馬上就看答案了。而且我說了,有些題是找規律或者邊界很多的,這類題需要你多思考、動手,不是說我多刷幾道就可以了。

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

上面的做題方法,不一定適合每一個人,只是我自己的學習以及建議,供大家參考。

leetcode 刷500道题,笔试/面试到底稳不稳

博客免費入駐啦~福利多多,詳情戳下方圖片,麼麼噠~

leetcode 刷500道题,笔试/面试到底稳不稳


分享到:


相關文章: