更新於 2024/06/30閱讀時間約 5 分鐘

今天不寫 code -- 聊聊 Leetcode 刷題

相信準工程師&已經是工程師的人,對 Leetcode 網站不陌生,即使沒用過,也會聽圈內人提及它。

簡單來說,它是個程式語言版的線上題庫平台,除了提供題目描述、讓你撰寫程式碼的區塊之外,也能看到其他解題者分享的解法、疑問討論。當你送出你寫的程式碼,並且 Accept(i.e. 通過題目設定的所有 test cases)的話,還能看到你的 runtime、memory 使用量的表現排行,同時可以點選前面排名的長條區域,看看更好表現的寫法長什麼樣子。

我在職訓期間開始接觸 Leetcode,直到二面上機考、試用期考核都是靠 Leetcode 練習&考試,即使轉正了,也偶爾看看 LeetCode Weekly Digest 有什麼有趣的題目可做。這裡就來分享一下我的使用經驗與觀點。


初入 Leetcode

在職訓期間,有講師跟所有學員簡單地1-1面談,了解一下他們未來的志向,並提供建議。當我提到想要做數據相關的工作,並且履歷投遞首先鎖定在科技業時,講師給了一個非常明確的準備方向:刷 Leetcode 上的題目,刷爆!

「刷題」這個詞,對我來說一點都不陌生:在之前的數學教育職涯,最討厭聽它 XD

從學習心理學的角度來說,練習大量題目可以增加熟練度,尤其對單純仰賴程序性知識計算題很有用,但過度練習到接近反射動作的話,容易看到關鍵字(90度 -> 畢氏定理) or 關鍵物件(平行線 -> 比例線段),就鎖定在單一解題策略上,面對需要理解圖表、情境描述的應用題時,無法彈性地思考、規劃如何解題,輕則解題費時,重則直接卡題,都不是在測驗表現上樂見的狀況。

不過相對地,以工程師身份來說,還在菜鳥等級的我,就是需要刷 Leetcode 上的題目來練好基本功;就像你不會數學基本運算,即使你有計算機(可以想像是現在很夯的生成式 AI 工具),也不會知道怎樣操作這些符號,取得正確的答案,更不用說要回答應用類型的問題。在正式踏入職場後,這個認知更加明確:工作上的任務相當於應用題,Leetcode 上的題目則跟計算題等價,相輔相成,缺一不可。

至於是否會擔心剛才提到的過度練習所帶來的反效果,我對自己是挺有信心,不會太輕易地落入這個困境。一來本來就知道有這個風險,會有意識地避免 XD ,二來也沒有非常密集地「只」做 Leetcode 上的題目,因為上班就會轉換到應用題的模式,自然就不容易被“框住”。如果是還沒踏入工程師界的讀者,想要避免過度練習的問題,比較簡單的做法是:找不同平台的題目穿插著練習;通常不同平台的題目取向會有差異,能一定程度地讓大腦恢復彈性。

面對 Leetcode 的解題心態

同樣是把 Leetcode 當作練功夫的地方,但每個人的做法仍有所不同。在轉職與職場上,跟身邊的人交流了些看法,以下整理幾個經常討論到的觀點:

致力於寫出表現最好的解法?

如前面簡介所述,Leetcode 的每道題目都會呈現你的解法表現如何,因此不難理解,有些人會在想出最佳解時,才提交解法,甚至把排行前面的解法背起來。

這讓我想起學生時期參加數學競試的經歷。難度較高的題目,不走特定的思路破題,根本無法解出答案,有些人就會採取「背解法」的策略。我不否認一些 tricky 的手段,可以幫助解題,但我認為「理解手段有用的原因」才是重點。

所以,我在解 Leetcode 題目時,不會一開始就要求自己寫到最好,而是先以自己的思路,想辦法寫出 Accept 的結果(aka 程式碼能 work 優先),再從表現排行 or 解法討論區,研讀其他人的解法,從中擷取自己看得懂,或者目的相同但寫法更討自己喜歡的部分,融合進原本的思路中,漸進地改善解法的表現,既使沒改善也無妨,重要的是你知道這個解法在做什麼,以及每個步驟為什麼要這麼寫。

也許為了解題需要,終究是要把關鍵步驟背起來,但先嘗試理解它再背,才有可能內化成自己的知識,比硬記更有效果。

只練特定領域或特定難度的題目?

如果你已經有明確的練習目標,鎖定特定領域的題目來練習是OK 的,Leetcode 也有提供搜尋特定領域題目的功能,讓你更方便地找到合適的內容。而難度的部分,有人覺得一定得練 Medium 或 Hard 的題目,才能讓自己的技巧等級提升,絕對看不上 Easy 的題目。

確實有人會以儀表板上的練習題數當作“戰績”,顯示自己的技術等級高低;對資歷深的工程師來說,或許是如此,但對尚屬資淺的我認為,與其呷緊弄破碗,不如細水長流。

不免俗地再以學習數學為例。還沒學穩基礎就想跳級做難題,自己打擊自己的信心,怎麼會想繼續學下去呢?根據自己的學習狀況,漸進地提升等級,保持面對題目、解題的感覺,才可能學得久,累積夠多經驗後,自然能解決一定難度或複雜度的問題。

所以,我覺得一開始上 Leetcode 練習時,無論在挑選領域或難度上,別給自己太大的壓力,先找你覺得有興趣、有 fu 的題目來做,做多了之後,再 focus 在想做的領域,或者想挑戰的難度,也為時不晚。


Epilogue
「今天不寫 code」系列,主要以個人的經歷,分享工程師職場的軟知識(技術面已經有很多大手級的內容可參考了,暫時還沒辦法觸及這個等級😅),希望未來可以持續更新下去💪🏻
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.