今天不寫 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
11會員
40內容數
世界不斷變動,總有些新奇的事物,等待我去發掘、剖析與分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
貓想享 的其他內容
在職訓課程的最後,就是重頭戲——專題製作。這是需要自行發想主題,並從班上召集有共同想法的同學,一起完成的結訓成果,也可以想成展現技術的作品,未來能用在履歷或面試報告上。過程中經歷了主題討論、組員挑選、製作與成發,讓我收穫更多,以及一些歡樂(?的部分,在此一併分享給大家。
既然決定參加職訓,就要能夠「對症下藥」,找最接近我想做的領域來上,因此當初直接以「數據分析」、「資料科學」等關鍵字搜尋,最後選擇了結合現今正行的AI相關課程。本篇將以課程為主題,分享職訓的感想。
kaggle在2022年針對平台的資料科學家調查,他們使用程式語言的前三名為Python、SQL、R。先前把SQL學到一個段落,接著就學習Python,並整理了學習期間的小小心得。
在準備轉職期間,為了能更接近數據分析的領域,首先決定要進修的領域是程式語言,首先從門檻相對不高的SQL(Structured Query Language,結構化查詢語言)開始。在此分享目前為止學到的一些小小心得。
在重新當個學習者的期間,我還同時準備了TOEIC檢定考試。仗著自己的英文底子,加上曾經參加過GEPT的經驗,以為準備起來很容易。這裡就談談我準備的經驗,以及記錄未來還能努力的方向。
在職訓課程的最後,就是重頭戲——專題製作。這是需要自行發想主題,並從班上召集有共同想法的同學,一起完成的結訓成果,也可以想成展現技術的作品,未來能用在履歷或面試報告上。過程中經歷了主題討論、組員挑選、製作與成發,讓我收穫更多,以及一些歡樂(?的部分,在此一併分享給大家。
既然決定參加職訓,就要能夠「對症下藥」,找最接近我想做的領域來上,因此當初直接以「數據分析」、「資料科學」等關鍵字搜尋,最後選擇了結合現今正行的AI相關課程。本篇將以課程為主題,分享職訓的感想。
kaggle在2022年針對平台的資料科學家調查,他們使用程式語言的前三名為Python、SQL、R。先前把SQL學到一個段落,接著就學習Python,並整理了學習期間的小小心得。
在準備轉職期間,為了能更接近數據分析的領域,首先決定要進修的領域是程式語言,首先從門檻相對不高的SQL(Structured Query Language,結構化查詢語言)開始。在此分享目前為止學到的一些小小心得。
在重新當個學習者的期間,我還同時準備了TOEIC檢定考試。仗著自己的英文底子,加上曾經參加過GEPT的經驗,以為準備起來很容易。這裡就談談我準備的經驗,以及記錄未來還能努力的方向。
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
題目敘述 題目會給我們一個字串s。 要求我們移除字串中的星號,還有刪除星號左手邊最靠近的第一個字元。 以字串的形式返回輸出答案。 題目的原文敘述 測試範例 Example 1: Input: s = "leet**cod*e" Output: "lecoe" Explanation:
Thumbnail
題目敘述 題目會給我們一個定義好的類別和function介面,要求我們實作建構子和ping() function來滿足指定的需求。 RecentCounter類別的建構子 建構子應該初始化來電紀錄,內容為空(零筆資料) int ping(int t) t代表來電時刻,單位是毫秒m
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
題目敘述 題目會給定兩個輸入。 第一個輸入是關鍵字清單products,第二個是使用者輸入的字串searchWord。 要求我們實現關鍵字搜尋建議系統,使用者每輸入一個字元就推薦一次。 推薦時,優先返回字典序(Lecial order)最接近的關鍵字,最多不要超過三個關鍵字。 題目的原文
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
Leetcode 精選75題 題目與題解 熱門考點 目錄 (持續更新中) 建議從左側目錄 或者 按Ctrl+F輸入關鍵字進行搜尋
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
最近有新的訂閱者加入, 想趁這個機會再分享一次學習心法與建議給第一次練習的讀者、同學們。 如果你本身已經很熟練演算法,那隨機挑題目練習ok,可以測試觀念是否正確,並且驗證寫code的效率與正確程度。 如果是剛畢業或還在學,以前沒有打過程式競賽。 想開始有系統地增強演算法&資料結構的能力
Thumbnail
題目敘述 題目會給我們一個字串s。 要求我們移除字串中的星號,還有刪除星號左手邊最靠近的第一個字元。 以字串的形式返回輸出答案。 題目的原文敘述 測試範例 Example 1: Input: s = "leet**cod*e" Output: "lecoe" Explanation:
Thumbnail
題目敘述 題目會給我們一個定義好的類別和function介面,要求我們實作建構子和ping() function來滿足指定的需求。 RecentCounter類別的建構子 建構子應該初始化來電紀錄,內容為空(零筆資料) int ping(int t) t代表來電時刻,單位是毫秒m
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
題目敘述 題目會給定兩個輸入。 第一個輸入是關鍵字清單products,第二個是使用者輸入的字串searchWord。 要求我們實現關鍵字搜尋建議系統,使用者每輸入一個字元就推薦一次。 推薦時,優先返回字典序(Lecial order)最接近的關鍵字,最多不要超過三個關鍵字。 題目的原文
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val