想要學習算法、應付筆試或者應付面試手撕算法題,相信大部分人都會去刷 Leetcode,有讀者問?若是我在 leetcode 堅持刷它個 500 道題,之後筆試/面試穩嗎?html
這裏我說下個人我的見解,我認爲不穩。下面說說爲啥不穩以及算法題應該如何刷、如何學才比較好,固然,也會推薦本身學過的資料。程序員
在刷 leetcode 的時候,你會發現,每道題的題意都很短,你只須要花十幾秒的時間,就知道這道題是要你幹嗎了,而且每道題所用道的算法思想都很明確,動態規劃、遞歸、二分查找等,你可能很快就知道該用哪一種方法,只是你不懂如何把代碼寫出來而已。面試
而在筆試中是徹底不同的,在筆試中,大部分題目都是情景題,可能讀懂個題目都須要花很多時間,偶爾還會遇到不大知道題目要咱們幹嗎,並且有時間限制,估計每道題給你分配的時間是 30 分鐘。這裏我隨便扔一道題給你們看看(Shopee去年的真題)算法
而且你可能不容易看出來,這些道題該用什麼方法好,有多是多種方法的結合(固然,不是指這道題哈)。編程
也就是說,在 leetcode 中,hard 級別的題作的出來,而在筆試中 medium 級別的,因爲時間、心態等因素的影響。你可能還作不出來,固然,大佬除外。下面說一說題型的一些題型以及如何學習算法會好應付點。數組
在筆試中,我認爲主要有以下幾種題型:微信
一、基本數據結構的考察:這類題我以爲是比較簡單的,主要考場基本數據結構的操做,例如二叉樹的層序遍歷,鏈表的逆序等,固然,它不會直接告訴你,讓你來逆序或者遍歷。例如數據結構
二、某種算法思想的掌握:這類題你掌握了某種算法思想,就會比較容易,若是不懂,那就涼涼了。例如動態規劃、回溯、枚舉、深度/廣度、貪心、二分等。其中,我以爲動態規劃考的挺多,還要就是 回溯+深度/廣度。例如ide
因此,常見算法思想,必定要掌握。函數
三、邊界條件的考察:這類型的題,估計你一看就有思路,知道該怎麼作,可是,它的邊界條件特別多,須要分不少種狀況來討論,特別容易出錯,有時候會讓人陷進去,越作越複雜,這類題主要考場你的思惟嚴謹程度。例如
四、找規律、數學公式:這類型的題,主要是根據數據之間的一些關係,來找一些規律,進而推出他們的通用公式,就像咱們高中時,找數列的同項同樣。例如
上面說了筆試題的一些狀況,也說了主要考察的一些題型。針對這些題型,我以爲在刷題的時候,你要作好下面幾件事。
概括?總結?估計大部分都知道概括、總結這麼一回事,可是,有沒有去實踐我就不知道了。
(1)、數組和相關題型
對於算法題,仍是有不少種題型須要去總結的,若是你懂這個題型,之後遇到相似的題,相信很快就能作出來的。有哪些題型能夠總結呢?答是很是多:例如
(1)、給你一個非負數的數組,求最大子數組和的長度
這算是一個題型,關於這個題型,有不少種變形、拓展,這裏建議一塊兒概括總結,例如
(2)、剛纔給的數組是非負數的,如今變一下,給的數組是可正可負。
還能繼續拓展嗎?答是能夠的,例如
(3)、給你個矩陣(即二維數組),求最大子矩陣和的面積
還有嗎?有,例如剛纔是求最大和,如今我改爲求最大乘積。
我舉上面這些例子,就是想告訴你,對於前期的學習,我建議分類刷題,總結題型,像我上面舉的這些例子,在筆試/面試中仍是比較常見的,若是你懂得對應的方法,就能夠秒殺了,由於這類題,沒啥邊界或者規律。例如我剛纔距離的Shopee的零食櫃那道題,實際上就是數組切割題型,至關於給你一個數組,讓你切割 n 下,那麼能夠把數組切割成 n + 1 個子數組,怎麼樣切割,才能讓最大子數組的和最小?
關於題型的,仍是不少的,我這裏沒法一一給你列舉,只能靠你刷題的過程當中,進行分類、總結。不過我能夠給你推薦一些資料,後面推薦哈。下面我在說一些題型吧。
(2)、基本數據結構操做相關題型
剛纔我說了,筆試題的考察,有一類題是基本數據結構的考場,並且,這類題在面試中,也是高頻考點,在筆試中,倒不是很高頻。對於這類題,我以爲你願意去總結,那麼之後遇到,問題不大。例如
鏈表的各類操做:逆序(部分逆序、按某種條件逆序)、判斷是否有環,環的入口節點、刪除指定節點等。
二叉樹的各類操做:各類非遞歸的遍歷操做(前中後、層)、二叉樹的公共祖先、根據前中後的遍歷結果來重構二叉樹等等。
隊列、棧相關操做:最小棧、來隊列來實現棧等。
(3)、字符串相關問題
不得不說,字符串相關問題,估計考的最高頻,並且,我能夠告訴你,對於字符串相關問題,90% 能夠用動態規劃來解決。反正對於字符串問題,我通常想法就是可否套用動態規劃,字符串問題有點多,不過你有時間,建議總結。例如:通配符的匹配、最長公共子串、最小編輯代價、最長迴文串等等。大部分都是用動態規劃,並且,我以爲解法都差很少,因此強烈建議專門花一段時間來作、總結、概括。後面我也會寫這方面的算法文章,敬請期待。
(1)、邊界、找規律題型
剛纔我說有一類題型是邊界特別多的,對於這類題,我以爲很差總結,這類題考察你邏輯是否嚴謹,可否化繁爲簡。這裏我建議多作幾道,作的時候,多本身思考,千萬不要以爲本身知道思路,本身怎麼寫,只是狀況太多,懶的寫,直接看別人的答案,這樣子,這道題你作了價值不大,由於這類題就是考察你思惟完整性的,最好是本身作,可能你用了 十幾個 if 語句,不要緊。接着你能夠把你的 if 語句進行化簡,查找他們的共同點。最後你能夠看大佬們的作法,你的收穫會更大!
對了,也千萬別急着動手寫,應該想想可行性,否則你容易陷入無底深淵。
對於找規律的題型也是同樣,這類題最後別急着看答案,應該多思考,多作幾道,作多了,你的思惟會愈來愈靈敏,之後看到這類型的題,能夠很快有思路。
因此,對於這種邊界、規律題,我的感受總結的價值不是特別大,更多的是多思考,多動手。
注意:每道題,咱們都要追求最優解哈,別以爲 ac 了就完事了。
上面說了那麼多,可能有人是道理我都懂,可我仍是學不會,說實話,學習的方法有不少,每一個人的學習方法也都不同,我這裏也只是提供一種參考。可是,不管什麼方法,你不去動手執行,那麼,一切都是空話。
這裏我推薦一些我看過的書,感受挺不錯。
文中涉及到的書籍以及視頻,在個人微信公衆號:苦逼的碼農,回覆『算法學習』便可獲取
一、書籍推薦
剛纔我說了不少種題型,對於按題型刷題總結,首推《程序員代碼面試指南:IT名企算法與數據結構題目最優解》,這本書真的挺不錯,大部分題型都總結了,並且每一個專題有十幾二十道,這裏建議你們買原本學習。
還要一本我大一看的,感受也挺不錯,叫作《挑戰程序設計大賽》,不過這本比較適合不急着面試的吧,這本不像上面那一本,專門來總結各類題型應付面試。
《編程之美》、《編程珠璣》也建議看,這兩本我以爲比較有趣,不是說讓你一直刷題一直刷題,這兩本你能夠買來看看,會給你帶來一些思路,這兩本我是隻看,沒動手打代碼。
Leetcode 刷題的時候,也是能夠分題型刷滴,因此也能夠去 leetcode 刷題,不過刷題的時候,我這裏有個建議,就是別在本地 IDE 寫代碼,直接在網頁端寫就好了。由於面試的時候,通常就讓你在記事本寫代碼,不會給你 IDE。若是你不習慣,估計很容易寫錯代碼,並且,有些庫函數你也把名字忘記了。網頁端其實也是挺方便的,也會有一些代碼提示。
對於,對於連各類算法思想、數據結構都還不懂的同窗,上面的數據不大合適哈,推薦我看過的兩本書《數據結構與算法分析 — C 語言描述版》、《算法設計與分析基礎》(這本代碼實現是用僞代碼的)。
二、視頻推薦
說時候,我視頻看的很少,對於算法的學習,特別是刷題,我是不大習慣看視頻,若是你想看視頻,我以爲牛客網的算法視頻還不錯吧,我沒過幾集,分初級班和進階班。其餘的我也沒看過,因此這裏能夠推薦的很少。
回到標題,leetcode 刷 500 道題穩嗎?說實話,你能堅持刷 500 道題,說明你的能力仍是挺強的,可是對於筆試,我以爲不必定穩,得看你怎麼作,例如是否追求最優解,是否進行總結概括,仍是說你只是暴力 ac 了以後就不理了,或者不敢跳出溫馨區,總是作那些比原本就比較擅長的題目,而遇到本身弱的題目,立刻就看答案了。並且我說了,有些題是找規律或者邊界不少的,這類題須要你多思考、動手,不是說我多刷幾道就能夠了。
總之,對於刷題,千萬別追求數量!
上面的作題方法,不必定適合每個人,只是我本身的學習以及建議,供你們參考。想要獲取上面那些資料的,能夠在個人公衆號 苦逼的碼農 回覆『算法學習』便可獲取。
今天是國慶最後一天,你們也玩夠了,因此接下來,就要好好學習了,先把本身的硬實力提高起來。在後面,我也會多寫一些算法題,例如動態規劃,回溯,遞歸等。
一、點贊,可讓更多的人看到這篇文章 二、關注個人原創微信公衆號『苦逼的碼農』,第一時間閱讀個人文章。公衆號後臺回覆『電子書』,還送你一份電子書大禮包哦。 三、也歡迎關注個人博客哦。
做者:帥地,一位熱愛、認真寫做的小夥,目前維護原創公衆號:『苦逼的碼農』,以寫了150多篇文章,專一於寫 算法、計算機基礎知識等提高你內功的文章,期待你的關注。 轉載說明:務必註明來源(註明:來源於公衆號:苦逼的碼農, 做者:帥地)
原文出處:https://www.cnblogs.com/kubidemanong/p/11751233.html