開始 LeetCode 之旅
嘿,大家好!我解決了很多 LeetCode 問題。我目前仍然失業,所以我們來解決另一個 LeetCode 問題,並最終希望能從 Google 獲得一份工作機會。在經歷了數百小時的努力和對問題的解釋後,我面試了十幾位候選人。我了解到準備工作有不同的層次,我將分享我所知道的關於整個過程的一切,包括如何練習、應該解決多少問題、要避免的常見錯誤,以及我是否認為 LeetCode 像大多數人認為的那樣是在浪費時間。
一開始,我從簡單的問題開始。我使用 C++,因為它是我學的第一門語言,但這有點錯誤。不幸的是,我後來才意識到這一點。最初,即使我知道解決方案,我也無法解決簡單的問題,總是被邊界情況所困擾。我不是數據結構和算法方面的專家,我主要知道一些基本知識,如數組、鏈表、哈希表、樹、排序和二分查找。老實說,在你真正開始解決問題之前,我認為這些就足夠了,因為很多簡單的問題會鞏固你對基礎知識的理解。
最初的進展與錯誤
在解決了 50 個問題後,我可以解決很多簡單的問題,比如反轉字符串或反轉二叉樹,但我甚至還沒有接觸過圖形問題,也不知道什麼是動態規劃。但信不信由你,50 個問題就足以讓我在一家銀行獲得實習機會。但我知道,如果我想在一家大型科技公司找到工作,我必須繼續努力。
我繼續以隨機的順序解決問題,這是另一個錯誤。在解決了大約 60 或 70 個問題後,我轉向了 Python。我經常查看 LeetCode 的討論部分,發現 Python 代碼總是最短和最簡潔的。即使我以前從未使用過 Python,直到今天,我也從未在任何工作或實習中使用過 Python,但這是一個容易的選擇,因為你不必學習整個語言,你只需要學習基本語法、如何寫 if 語句、for 循環以及所有標準數據結構和方法。你可以在解決 LeetCode 問題時通過谷歌搜索來學習這些。
C++ 也不是一個壞選擇,但我肯定會避免像 Java 這樣冗長的語言。語言可能不是決定因素,但在你輸入代碼時,它肯定可以為你節省幾分鐘,這在真正的面試中肯定會有所不同。
學習算法與解題順序
即使解決了 100 個問題,雖然我已經學會了所有高價值的算法,如 DFS、BFS、滑動窗口和回溯,但我仍然無法一開始就持續解決一個新問題。當時我並不知道,原因是很多 LeetCode 問題是有順序的。你可能已經看到過像「House robber 1」、「House robber 2」和「House robber 3」這樣的問題。顯然,你應該按順序解決這些問題,但實際上,大多數 LeetCode 問題都應該按特定的順序解決。例如,除非你已經對回溯有了很好的理解,否則你不應該嘗試解決動態規劃問題;在你對樹有了很好的理解之前,你可能不應該嘗試解決圖形問題。這事後看來很明顯,但我相信很多人都犯了這個錯誤,這就是為什麼我創建了一個路線圖,這樣你就不會犯和我一樣的錯誤。原來,你解決問題的順序確實很重要。
我還認為,每天持續解決一兩個問題比臨時抱佛腳要好得多,因為這樣想法才能真正記住。如果你需要一點動力,我一直在我的第二個頻道上解決每日 LeetCode 問題。
解題策略與時間管理
我意識到,如果我在 45 到 60 分鐘內無法解決一個問題,我就無法自己解決它。以前,我會在一個問題上花三到四個小時,因為我認為這是唯一的學習方法。但老實說,我們大多數人都無法自己想出一些複雜的學術算法。即使你能想出 Floyd 的龜兔算法,這可能也不是你時間的有效利用。只要你能完全理解為什麼它有效,看解決方案並沒有什麼丟人的。這就是為什麼在我的視頻中,我真的嘗試解釋每個問題背後的思考過程。
這最終為我節省了很多時間,因為我會遇到一個非常難的問題,我喜歡稱之為「瘋狂問題」,比如「burst balloons」。我會非常接近解決這個問題,我知道這是一個動態規劃問題,但我就是想不出背後的技巧。然後我會看一個解決方案,只需要五分鐘的閱讀,我就會意識到,「哦,這就是技巧」,然後我就能立即解決這個問題。
我能夠從解決 100 個問題到解決 250 個問題,比我解決前 100 個問題要快得多。到那時,我已經學會了我需要的 99%的模式,甚至是一些複雜的模式。我達到了這樣的程度,寫出像 DFS、BFS 和二分查找這樣的算法對我來說就像寫一個 for 循環一樣容易。甚至一些高級的算法,如 Union find、Dijkstra's,我也能在不到五分鐘的時間內寫出來。
面試準備與信心
那時我意識到,大多數 LeetCode 問題都屬於這些類別。對於中等難度的問題,你只需要找出你需要的算法,然後應用它。困難的問題類似,只是背後通常有一個非常複雜的技巧。有時,除非你以前見過,否則只有上帝能幫助你想出來,或者也許你的面試官如果他們碰巧慷慨的話。
在這一點上,我有信心我可以通過面試,但我不是 100%確定我是否準備好參加像 Google 或 Facebook 這樣的大型科技公司的面試。提示:你可能永遠不會覺得自己 100%準備好了。是否準備好面試不是一個二元決定,因為你永遠不知道你會被問到哪些問題。這更像是一個分布,你可能有 50%的機會通過,或者你可能達到有 90%的機會通過的程度。如果你是一個完美主義者,我相信你想要 100%的機會,但這幾乎是不可能的。
我認為一個好的經驗法則是,你應該能夠在 20 到 25 分鐘內解決一個你以前從未見過的中等難度的問題。如果你能做到這一點,你可能至少有 80%的機會通過大多數 FANG(Facebook、Amazon、Netflix、Google)的面試。
我繼續解決了 569 個問題,即使我已經進入了 Google,主要是因為我是一個「輸家」(自嘲)。但這並不像你想象的那樣耗時,因為我已經達到了可以在 10 到 15 分鐘內解決大多數中等難度問題的程度。但我絕對不建議這樣做,因為解決越來越多的問題會有遞減的回報。我認為質量比數量好得多。
推薦的學習資源
我推薦解決大約 150 個問題,比如 Neat Code 150 列表,它有 14 種語言的視頻解決方案和代碼解決方案。但確保你真正理解每一個問題。大多數人犯的一個巨大錯誤是,他們不回去復習以前的問題。對於這些複雜的算法,要真正理解,你需要重復。這就是為什麼我正在努力將 Neat Code 150 列表中的每個問題轉換成多選測驗,因為很難回去重新解決每個問題,通常你只需要復習技巧。我製作了測驗,你應該能夠在幾分鐘內解決,但也能從中獲得很多價值。你現在可以查看一些問題,但當列表完成時,理想情況下,你應該能夠在一天內完成。我認為這對人們來說將是一個巨大的節省時間的方法。
LeetCode 的價值與總結
那麼,在經歷了這一切之後,LeetCode 只是在浪費時間嗎?是的,如果你想學習開發和實際構建應用程序,LeetCode 可能不會幫助你做到這一點。但人們會花數千小時獲得計算機科學學位以獲得一份體面的工作,但卻不願花額外的 100 小時來獲得大幅的薪酬提升,這對我來說真的沒有什麼意義。
不要誤會我的意思,LeetCode 並不是世界上最令人興奮的事情,但我確實認為它可以幫助你思考邊界情況以及如何對你的代碼進行單元測試。這些技能可以應用於應用程序開發。信不信由你,算法和數據結構在工業中被廣泛使用,從數據庫引擎到編譯器。
但確實,LeetCode 不會教你所有的東西。這就是 Taro 發揮作用的地方。它是一個由 YC 支持的平台,旨在幫助你在科技職業生涯中成長,包括幫助你盡快入職並使用有經驗的技術領導和領導者的大師課程更快地獲得晉升。你可以使用描述中的鏈接查看它,並使用代碼「Neat Code」獲得 20%的高級版折扣。
感謝 Taro 贊助這個視頻,我們下次見!