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

Mineko-avatar-img
發佈於學享
更新於 發佈於 閱讀時間約 5 分鐘

相信準工程師&已經是工程師的人,對 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」系列,主要以個人的經歷,分享工程師職場的軟知識(技術面已經有很多大手級的內容可參考了,暫時還沒辦法觸及這個等級😅),希望未來可以持續更新下去💪🏻
留言
avatar-img
留言分享你的想法!
avatar-img
貓想享
11會員
40內容數
世界不斷變動,總有些新奇的事物,等待我去發掘、剖析與分享。
貓想享的其他內容
2024/11/18
主修數學又自主選修心理學,不僅讓我畢業後即踏入數學教育職場,意外地繼續幫助我轉職成工程師,尤其在「資料科學」與「人工智慧」的領域。本文分享讓我發覺心理學可以派上用場的 moment
Thumbnail
2024/11/18
主修數學又自主選修心理學,不僅讓我畢業後即踏入數學教育職場,意外地繼續幫助我轉職成工程師,尤其在「資料科學」與「人工智慧」的領域。本文分享讓我發覺心理學可以派上用場的 moment
Thumbnail
2024/08/25
簡報能力、寫作能力及溝通力,這些乍聽之下與工程師搭不上線的技能,其實能發揮正向推進任務的作用。我想這值得我用一篇文章,好好分享這個經驗。
Thumbnail
2024/08/25
簡報能力、寫作能力及溝通力,這些乍聽之下與工程師搭不上線的技能,其實能發揮正向推進任務的作用。我想這值得我用一篇文章,好好分享這個經驗。
Thumbnail
2023/12/03
在職訓課程的最後,就是重頭戲——專題製作。這是需要自行發想主題,並從班上召集有共同想法的同學,一起完成的結訓成果,也可以想成展現技術的作品,未來能用在履歷或面試報告上。過程中經歷了主題討論、組員挑選、製作與成發,讓我收穫更多,以及一些歡樂(?的部分,在此一併分享給大家。
Thumbnail
2023/12/03
在職訓課程的最後,就是重頭戲——專題製作。這是需要自行發想主題,並從班上召集有共同想法的同學,一起完成的結訓成果,也可以想成展現技術的作品,未來能用在履歷或面試報告上。過程中經歷了主題討論、組員挑選、製作與成發,讓我收穫更多,以及一些歡樂(?的部分,在此一併分享給大家。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
LeetCode 是一個程式語言版的線上題庫平臺,提供題目描述、程式碼區塊、解題者分享的解法和疑問討論。藉由這篇文章分享我在 LeetCode 上的使用經驗和觀點,包括刷題的重要性、解題心態和練習目標。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目敘述 Patching Array 題目給定一個整數陣列, 請問還要補上多少個數字,才能用這些數字的和拼湊出所有1~n的整數。
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
題目敘述 Solving Questions With Brainpower 給定一個測驗題陣列,每個欄位都是一個pair, 分別記錄測驗題做完可以得到的分數,和需要的冷卻時間 (也就是會有一段時間不能作答接下來的題目)。 請問在最佳的答題策略下,最多可以獲得多少分數?
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
探討如何使用DP動態規劃的方法來進行單字串接,包含了DP遞迴關係式、狀態定義、優化技巧和程式碼示例。同時分析了時間複雜度、空間複雜度和關鍵知識點。這是LeetCode的一個應用題,類似於Word Break I的延伸。
Thumbnail
探討如何使用DP動態規劃的方法來進行單字串接,包含了DP遞迴關係式、狀態定義、優化技巧和程式碼示例。同時分析了時間複雜度、空間複雜度和關鍵知識點。這是LeetCode的一個應用題,類似於Word Break I的延伸。
Thumbnail
題目敘述 題目會給定我們兩個字串。 第一個是指定順序的字串order。 第二個是輸入字串s。 要求我們依據order給定的順序,重新排列s。 如果出現order中沒有出現的字母,任意位置皆可。 合法答案可能不只一組,輸出其中一種即可。 題目的原文敘述 測試範例 Example
Thumbnail
題目敘述 題目會給定我們兩個字串。 第一個是指定順序的字串order。 第二個是輸入字串s。 要求我們依據order給定的順序,重新排列s。 如果出現order中沒有出現的字母,任意位置皆可。 合法答案可能不只一組,輸出其中一種即可。 題目的原文敘述 測試範例 Example
Thumbnail
題目敘述 題目會給我們一個字串s。 要求我們移除字串中的星號,還有刪除星號左手邊最靠近的第一個字元。 以字串的形式返回輸出答案。 題目的原文敘述 測試範例 Example 1: Input: s = "leet**cod*e" Output: "lecoe" Explanation:
Thumbnail
題目敘述 題目會給我們一個字串s。 要求我們移除字串中的星號,還有刪除星號左手邊最靠近的第一個字元。 以字串的形式返回輸出答案。 題目的原文敘述 測試範例 Example 1: Input: s = "leet**cod*e" Output: "lecoe" Explanation:
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News