算法面试|论如何4个月高效刷满 500 题并形成长期记忆
Study less, Study smart; Trust yourself, Brace loneliness.
原文:https://leetcode-cn.com/circle/discuss/jq9Zke/
前言
本文我將分享給大家一套我自己使用良久并覺得非常高效的?學習論,它可以運用到 Leetcode 上的刷題,也可以 generalize 到生活中涉及到學習以及記憶的方方面面。當然,本文將以 Leetcode 刷題為 case study 去進行講解。?更具體一點, 我會教大家如何運用該學習論在 4 個月的時間內從 0 算法基礎到實打實刷滿 500 道題,并且形成長期記憶,同時具備高效解決各種同類型題目的能力。
自我介紹
我是?Eason, 是一名現在就讀于 CMU, CS 院 AI 相關 Master 的研二學生。在我的求職備戰期間,我是一名忠實的 Leetcode 用戶,并最終憑借 Leetcode 這個平臺給予的各方面幫助和資源拿到了北美 Facebook (Meta) 的 Full-Time Offer。時隔數月,我懷著一顆感恩的心回到這里,希望可以給大家分享下自己在 4 個月的備戰期間積累的一些個人經驗,盡可能地幫助大家少走彎路。本文篇幅較長,但保證干貨和誠意滿滿。
刷題時間線
我準備刷題的時間點非常晚 (Master first-year 全部用來刷 GPA 了,沒有做任何面試準備,甚至沒有實習, 現在回過頭來其實有一些后悔)。真正開始有規律地準備刷題大概是在 second-year 的 7 月到 10 月這四個月的時間,這四個月我在 Leetcode 上大概有 4500 個左右的 commits,總共 solve 約 550 道題 (難度分布大概是 4 : 6 : 1), 11 月則是幾乎全部用來鞏固舊題,進行各種面試前的最后沖刺。
方法論概要
我想要給大家分享的這套方法論原理并不復雜,里面的每一點單獨拎出來你或許都有所耳聞。但倘若想要長時間地 (三個月以上) 將其貫徹, 做到受益最大化,卻需要很強的毅力和自制力。我自己本人大概用了三年時間才慢慢地適應其節奏。我堅信, 如果你可以在四個月的時間將其貫徹到底,絕大部分 company 的算法輪對你而言將不再是任何阻礙。
簡單來講,它可以總結為以下 4 點:
1.始終保持勻速前進,既不松懈倦怠,亦不急于求成
2.定時歸納總結, 按類訓練
3.深度理解人的記憶規律,高頻率高效復習
4.擁抱孤獨, 過濾外界雜音, 平穩心態
Section 1: 始終保持勻速前進
對于?"每天刷多少題"?這個問題的探討,主要分為兩大流派,我姑且將它們稱為?"題海流"?和?"歸納流"。?假設質量和題量的乘積為定值, "題海流"?更主張犧牲部分的質量,通過?題海戰術?大量刷題, 做到以量取勝。?而?"歸納流"?則更求穩, 偏向于求質不求量,所以一天可能做不了幾題,但做一題是一題,且每做完一類題馬上停下來投入?大量精力?進行?歸納總結。
在最開始的時候,我是?"題海流"?的忠實信徒,平均一天?8 ~ 10?道新題起步,發力最猛的時候甚至一天要做?20?道題。我不得不承認在剛開始刷題的初期,我可以明顯感受到?"題海流"?給予我的強大?正反饋,每當自己看到自己的題量蹭蹭蹭上漲,那種興奮與成就感總是溢于言表。然而,沒過多久,我就發現了一個很嚴重的問題:?即無論我做多少道題目,碰見新的題我大概率還是沒有思路, 必須要看題解。更糟糕的是,一兩周過后,即便是遇到了我之前已經做過的舊題,我可能依舊不會做。?剎那間,起初的那種縹緲的?正反饋?瞬間被轉化為了與其對立且強度是其數倍的?負反饋。我開始頻繁地懷疑自己, "我是不是不適合學算法?","為什么我做了這么多題還是看不到進步?" 等問題席卷而來。然后你會發現這是一個惡性循環,持續不斷的負反饋會不斷摧毀你的自信,而你不斷被侵蝕的自信心則會給予你更多的負反饋。
In short,?"題海流"是絕對不適合任何?長線任務?的。如果刷題備戰期可以短到只有 7 天,這一流派或許能夠起到奇效,但是絕大部分人的備戰期是 3 個月甚至更久的時間。如果你在馬拉松的前 10 千米就開始沖刺了,要不了多久你就會覺得身心俱疲。因此,勻速前進就顯得至關重要。
勻速前進是"歸納流"最核心的思想之一。按照我個人的經驗,即便是 full-time 刷題想要快速脫產,一天的題量也絕對不要超過 5 ~ 6 題, 如果是 part-time, 標準大約減半。我個人的節奏是一般是一天 4 ~ 5 題, 早上兩題,寫完休息。下午再做兩題,并且復習早上做的題,寫完再休息。晚上只做一題或者一題都不做,利用全部時間來?復習歸納?一整天做的題 (關于為什么要將一天時間進行這樣切分以及為什么要這樣復習, Section 3 會進行詳細解釋)。Again, 不要 greedy, 絕大部分人每天的精力是有限且平均的,你今天做的事情超標了,看似賺到了,實際上是在透支明天的自己, 你每透支一次自己,節奏就會亂一次,所以從全局的角度來講你其實是虧損的。?另外,私認為每天都能夠保質地完成 4 ~ 5 題其實已經非常了不起了, 只有很少一部分人能夠長期堅持下去。?大部分人都是一周一小停,兩周一大停, 而這是非常低效的學習方法 (后文會解釋)。
歸納流另外一個核心思想則是歸納, 關于 "何時歸納" 以及 "如何歸納" 等問題我會在接下來的 Section 2 中進行詳細展開 (避免本 section 篇幅過長)。
Section 2: 定時歸納總結, 按類訓練
上個 section 我們從每個人每天精力守恒的角度闡述了?勻速前進?的重要性, 我們也討論了 "題海流" 可能會帶來的一些問題。?這個 section, 我們將深度討論?歸納?二字的重要性, 它是?題海流?最缺乏的要素,也是私認為是刷題 (或者是學習任何事物)?"最強大的核武器"。
通俗的講,歸納?其實就是嘗試在眾多相似事物之間尋求普遍規律,并試圖利用該規律去高效地解決更多的同類問題。到此,你應該可以讀出進行?歸納總結?的前提條件是先?具備一定數量的 "同類事物"。換句話說,刷題一定要同類型題目一起刷,切忌各種題型混在一起亂刷。比如,我想攻克?二分法?類題型,那么我這幾天甚至這一周就全部做?二分法?相關的題。要相信,在進行了大量針對性的同類型訓練后,隱藏在事物深層的普遍規律往往會自然而然地浮出水面。倘若此時能夠停下片刻,對其進行歸納和總結,我們得到的 benefit 將會是在各種題型之間頻繁切換的數倍。
這里我給大家一個具體的案例: 下面這篇文章是我通過大約五天時間訓練完絕大部分?滑動窗口?類型經典題目后,再用 2 天時間歸納總結的一套思維框架。運用它可以很快秒殺絕大部分該類型中檔題。而那些同類型的困難題,到頭來你會發現也只是基于同一框架多加了幾個 components (其他框架) 而已 ,其核心思想依舊不變。
[滑動窗口真滴簡單!] 閃電五連鞭帶你秒殺12道中檔題 (附詳情解析)
對于其他題型, 比如二分法,二叉樹 (前中后序),回溯等等,我采取的策略都是像這樣逐一進行攻破:?即一段時間內 (一般是5 ~ 7天) 只做該類型題目, 結合其他質量高的題解以及自身的見解歸納總結出一套屬于自己的框架。?我現在可以很坦誠的講,當我從?題海流切換到?歸納流并將后者徹底實施時,我認為我的 efficiency 至少提升了 5 個量級。與此同時, 我得到的?正反饋 (比如別人對自己的認可, 以及發現通過歸納, 自己的解題能力正不斷地得到提升等等)?要遠遠大于?負反饋。所以我會越刷越有自信,會越刷越想去攻克更多的題,即將之前的?惡性循環?成功地轉化成了?良性循環。
Section 3: 深度理解人的記憶規律,高頻率高效復習
或許你之前已經有所耳聞,人的記憶是具有規律的。人的記憶大概可以被劃分為 3 種類型 (也有的人將其劃分為 2 種):
(1) 短期記憶: 持續若干天或者一兩周的記憶 (2) 中期記憶: 持續數周或者幾個月的記憶 (3) 長期記憶: 持續數年甚至永世不會消逝的記憶。學習某項技能 (包括刷題),其終極目標往往是去形成長期記憶,因為它的價值最高,一旦獲取往往很難再失去。換句話說,一旦你會做一道或者一類題目之后,你或許永遠都會做。文章開頭介紹的?"題海流"?幫助形成的往往是短期記憶?-- 價值最低的記憶,而把后面討論的?"歸納流"?加上這個 section 即將討論的記憶方法綜合在一起則是為了幫助形成長期記憶。
形成長期記憶的方式非常簡單,即?頻繁的重復刺激。人們永遠不會忘記的總是那些需要不斷重復的東西: 怎么用筷子吃飯,怎么穿衣裝扮,怎么說某種語言等等。之所以永遠不會忘記它們,正是因為我們每天都在潛移默化地反復刺激大腦如何去運用它們。刷題或者 generalize 到學習某種技能亦是如此。因此,這里可以總結出另外一個結論:?復習舊題的重要性要遠遠大于做新題。這一點其實和我們之前討論的內容相互佐證,彼此互應。
那么該如何高效地復習并且形成長期記憶呢?這里不得不介紹一下艾賓浩斯遺忘曲線了。德國的心理學家艾賓浩斯告訴我們,人對于知識的遺忘速度遵循?"先快后慢"?的原則。學得的知識在一天后,如不抓緊復習,很快就只剩下原來的25%。隨著時間的推移,遺忘的速度減慢,遺忘的數量也就減少。去抵抗這種遺忘,最好的辦法就是進行有規律的 (每 5 分鐘,30分鐘,12小時,1天,2天,4天,7天,15天,1個月,3個月,6個月) 復習。然而個人認為這個劃分有點過細了,讀者可以結合自身的情況進行調整。我個人的復習規律是?每 2 小時,12小時, 2天, 7天,15天,一個月, 三個月。?這也是為什么我在上文提及到我會將一天分為早上, 中午和晚上三個學習區段,每一個區段只刷很少數量的題 (1 ~ 2題),并且開始每一個區段之前,都會首先復習之前做過的題,甚至晚上的時候一題也不做,全部精力都用來復習。
在運用這一套記憶方法僅僅數周之后,我就發現我的記憶相對于之前來比變得?異常牢固,堅不可摧, 碰到之前做過的題目可以像哈希表一樣用 O(1) 的時間做出響應, 當時還和朋友開玩笑感覺自己已經可以開始用?"脊柱做題"。?比如在 Facebook 的面試里我就遇見了共三道之前訓練過的題,對于它們,我思考加上寫完的時間平均下來大約只有 3 ~ 4 分鐘。再結合運用之前介紹的?歸納法,我同時也具備了一定的 generalization 的能力。所以遇見同類型的題目,即便不可以在有限時間內 bug-free 的寫完 (比如我面試的最后一道 hard 題 282),也能做個八九不離十, 并且把思路講得非常清楚 (這往往是很多公司更為看重的)。
這套復習方法雖然功效異常強大,但想要長期的堅持卻需要非常強大的毅力和自制力 (最后一個 section 我會著重討論如何鍛煉它們)。下面我給大家 share 一份?艾賓浩斯記憶曲線的 excel 表格, 大家下載后可以結合自身的記憶規律進行改進。
艾賓浩斯記憶曲線 excel 表格
同樣的,建議結合自身的實際情況進行微調, 我個人調整過后的風格如下 (我會著重記錄自己對于每一道題目的掌握情況):
上面 share 的這些資料建議大家結合自己的習慣搭配使用,它們真的可以起到事半功倍的效果哦!
Section 4: 擁抱孤獨, 過濾外界雜音, 平穩心態
光有一套系統的學習 (刷題) 方法依然是不夠的,如何調節自己的心態并使之始終平穩,對于跨度數月之長的備戰期來說也至關重要。我平穩自己心態的辦法有兩點:
(1) 擁抱孤獨 (2) 過濾外界雜音這里的擁抱孤獨,不是要教唆大家去成為一個孤獨的人,而是想要去強調?孤獨實際是人與生俱來的一種屬性,你要做的不是去逃避它,而是去接納它。很多小伙伴在備戰期間都會因為孤獨而亂了心神,必須要加各種刷題打卡群,相互監督群才能放心。然而這種 "放心" 實質上是虛假的。我起初的時候也加了很多很多各種各樣的群,試圖 "融入" 某個群體得到特殊的庇護,但到頭來只會發現絕大部分的這種群除了帶來無謂的焦慮外,很難起到半點正面作用。直到后來方才發現自己的孤獨反而可以成為自身最強大的武器。
對于做算法題這種需要投入大量精力去思考的 task 而言,獨立思考的能力往往大于一切。對于之前介紹的?歸納法?而言更是如此,你更多需要傾聽的是自己內心的聲音,你想要總結的也是那些屬于自己的思維框架。這通過把希望寄托于各種陌生人刷題群是很難實現的。然而, 我并沒有暗示大家不要去學習他人的東西。事實恰恰相反,別人好的題解,好的文章我們更要認真的去研讀,這就和做發明一樣,很多偉大的發明實際上都是基于前人的方法上加以改進得出的,但這絲毫不影響它們的偉大。因此,我想要表達的是希望大家不要從主觀意識上抗拒自身的孤獨感并不斷地尋找庇護。你不需要任何庇護,至少對刷算法題這件事而言,倘若你能運用好 Leetcode 社區提供的資源,不斷強大自身的毅力和信心,再配合使用本文介紹的方法論,你已經完全具備打敗它的一切潛質。
擁抱孤獨的另外一個好處就是可以幫助我們?過濾外界雜音。在之前長達四個月的備戰期間,我曾選擇近乎徹底地不再登錄娛樂以及各大社交平臺。其目的只有一個,那就是抗噪。?我們不得不承認互聯網給這個社會帶來的種種便利,但也不得不承認當今的互聯網是聒噪的,各種社交平臺尤甚。里面充斥著各種散播焦慮,攀比和凡爾賽的言論,以及花樣繁多的各種洗腦廣告。稍有不慎,你就會被 "污染",你就會潛意識地跟著大眾做那些大眾認為正確的事情, 而喪失了自己獨立思考的能力。別人買房,不代表你也要買房; 別人買車學車,不代表你也要買車學車; 別人炒股,不代表你也要炒股;?別人做任何他們想做的事情都跟你無關,老天賜予你的原本是一個獨特而有趣的靈魂,但當有一天你的意識被你口中的 "別人" 所左右之時,你最寶貴的?獨特性也將不復存在。
所以不要再沉迷和流連于各種?偽群體?或者?偽社區?之間,最好的方式就是離開它們,或者有效控制它們,從而捍衛你的初心。那么什么樣的狀態或者是心態可以稱之為平穩呢?私認為只要你可以做到?長時間地保持一個節奏,貫徹一個方案,不因取得階段性成就而大喜,亦不因遭受階段性挫折而大悲,心靜如水,那么你離你的目標就真的不再遙遠了。
以上就是我想要分享給大家的全部內容。人生苦短,能在有限之人生長期堅持一件事情并將其做好實屬不易。刷題之路長路漫漫,我真誠的希望大家能夠穩住自己的心態,隔離外界的干擾,用最科學和最高效的方法去學習,當你未來回首之際,你將會發現自己從中受益無窮。馬上暑假就要來臨了,下一屆秋招早已迫在眉睫,各位朋友們,倘若此時不動,敢問各位又更待何時呢?
最后
春招已經開始了,秋招也快來了,我們要提前準備好,背水一戰!
大家可以加我微信(備注:校招),我拉你入校招專屬群,一起學習,一起解決問題, 一起進步!
- END -
看完一鍵三連在看,轉發,點贊
是對文章最大的贊賞,極客重生感謝你
推薦閱讀
定個目標|建立自己的技術知識體系
大廠后臺開發基本功修煉路線和經典資料
個人學習方法分享
你好,這里是極客重生,我是阿榮,大家都叫我榮哥,從華為->外企->到互聯網大廠,目前是大廠資深工程師,多次獲得五星員工,多年職場經驗,技術扎實,專業后端開發和后臺架構設計,熱愛底層技術,豐富的實戰經驗,分享技術的本質原理,希望幫助更多人蛻變重生,拿BAT大廠offer,培養高級工程師能力,成為技術專家,實現高薪夢想,期待你的關注!點擊藍字查看我的成長之路。
校招/社招/簡歷/面試技巧/大廠技術棧分析/后端開發進階/優秀開源項目/直播分享/技術視野/實戰高手等,?極客星球希望成為最有技術價值星球,盡最大努力為星球的同學提供面試,跳槽,技術成長幫助!詳情查看->極客星球
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 求點贊,在看,分享三連
總結
以上是生活随笔為你收集整理的算法面试|论如何4个月高效刷满 500 题并形成长期记忆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试指南|GO高性能编程精华PDF
- 下一篇: 大厂提供什么样的软硬件来吸引人才?