---
# System prepended metadata

title: LeetCode 介紹
tags: [LeetCode]

---

# 前言
LeetCode是個很知名的程式刷題網站，本文就我對LeetCode的認知，介紹一下LeetCode，以便有興趣的讀者可以對她有基本的認識，判斷自己適不適合，並在刷題前做好一些準備。

LeetCode的主要目的是讓想去應徵資訊工程師的人，學習與模擬科技公司面試時的考試題目。基本上網站上就是一大堆的程式考題可以讓使用者做題目，它會記錄使用者的進度(解題狀況等等)，除此之外，有一些規劃好的study plan讓使用者可以依循著針對某些主題挑選好的題目來進行學習，另外每周有辦理weekly contest，讓參加即時的線上比賽，練習在有時間壓力下的解題。無論如何，這個網站主要就是程式解題。

下方的圖是網站上可以看到使用者個人解題狀況的統計資料。
![](https://hackmd.io/_uploads/BkPmmbmn3.png)


# 刷題方式介紹
題目列表看起來像下方的樣子
![](https://hackmd.io/_uploads/SkPveiV23.png)

題目名稱前有編號，基本上從1編到目前約2800，所以大概有2800題，第一題沒有依照編號順序，那是每日挑戰題(每日隨機選出)。題目左邊的狀態欄打勾是表示已經通過該題。難度顯示Easy、Median、Hard，Acceptance則是過去所有使用者對此題繳交的通過率，理論上通過率低的題目較難，但也未必是絕對的，例如題目有陷阱或比較容易犯錯疏失的，可能通過率會比較低。

![](https://hackmd.io/_uploads/r1gCGsVnn.png)
點進某一題目後，畫面類似上圖，但LeetCode介面時有改版，但主要內容差不多。左邊是題目描述(上方有標籤)，其中
* Description中說明題目、範例、以及參數(範圍)限制，這些是理解題目與做題目最重要的說明。
* Editorial：官解，不一定每題都有(開放)
* Solutions：使用者貼的解答。每個人都可以貼，大多可信，但也有錯誤的。
* Submission：自己的繳交紀錄，類似下圖。每次繳交的日期、語言，執行時間與記憶體用量等資訊。可以點開，點開某一次的繳交後會出現該次繳交的詳細資料，如下圖，包含執行時間與記憶體用量在全部使用者繳交中的排序百分比。那個百分比圖可以進一步點開，看別人(更厲害)的程式是怎麼寫的。

![](https://hackmd.io/_uploads/SyoJroEn3.png)

![](https://hackmd.io/_uploads/r16zIj423.png)

回到進入題目後的右方畫面，這是編輯程式與繳交的地方，如下圖。上方的標籤可以選擇語言，另外有一些編輯的工具，當然你也可以在自己電腦喜歡的編輯器上運作後再剪貼過來。
![](https://hackmd.io/_uploads/BJXnDoV2n.png)

右下方是主控台的畫面，可以收合讓編輯區變大。右下方Run的按鈕就是跑範例測資，主控台會顯示跑出來的結果，範測就是原題目給的範測，但可以改變。跑出的答案有如果錯，會告訴你正確答案與錯誤輸出。
Submit按鈕則是繳交送出，程式會去跑後面的所有測資，結果會顯示在result。如果是通過(正確也符合時間與記憶體要求)，就會出現前述時間空間百分比的頁面；如果不通過，會顯示**第一個錯誤的測資結果**，這個網站是以學習為目的的，所以錯誤測資的顯示，有助於改錯與學習。同時，你可以把此錯誤測資設成testcase，這樣改錯後可以用Run就會測試到此測資，而不必等繳交才測。

# 題型與範圍

### 語言
LeetCode支援的程式語言非常多，主流的程式語言C/C++、Java、Python當然有，總共支援十幾種。
### 題型
LeetCode的題目是要求使用者寫一個Class而非完整的程式，繳交後會有主程式來呼叫你寫的程式(類似於IOI的樣子而非ICPC的樣子)。所以，程式基本上是沒有輸入輸出的，輸入都是由參數傳遞送進來，這樣可以考的範圍更彈性，例如二分搜可以假設傳入的是一個已經排好序的陣列。
使用者可以用輸出去印一些東西來做為debug，繳交後是會告訴你輸出是什麼，但要小心不要輸出過多而變成TLE。
如果你要在本機除錯，要自己寫一個主程式，對於長期的刷題者來說，先建好一個主程式來除錯可能是必要的，有些執行的環境要弄好，主程式當然要寫對。曾經看過有人在臉書社團發問，懷疑LeetCode題目壞掉，其實是他自己的主程式寫壞。
以類別來說，除了資料結構語言算法是主流外，還有SQL(資料庫)
以及Concurrency與其他極少數的其他類型。

### 難度與範圍

基本上LeetCode有設定是用來模擬面試的，所以範圍與難度是有界限的。從範圍上來看，正常資工系學生在學校學了程式設計、離散數學、資料結構與演算法四門課後，應該有足夠的知識與技能來刷LeetCode的題目，當然每個學校課程不同，學生個人修練不同。我把離散數學納入是因為有些題目涵蓋到一些排列組合之類的計算以及位元運算(這個也可以視為程設課程的內容)。
LeetCode沒有很難的算法題，可能因為太難的題目出現在面試也不太合適，這不是說它沒有很吃思考的題目，我的意思是說，一些在競技程式比賽中，高階的資料結構與算法不太會出現在LeetCode中，舉例說，線段樹只有偶而出現，一些奇怪的DP優化基本上我是沒見到，圖論的算法中，Matching與Flow也沒看到(只有以要求暴搜的解的形式出現)
也因為是模擬面試，所以也沒有要求寫很長程式的髒髒題目，正解程式通常在二三十行(以不特別縮減的Python估計)，偶而到五十行左右。C++大概長一點，C我就不敢講了，用C刷題那只能佩服她的勇氣吧，當然有可能是他需要。

### 常用技巧與學習重點

* 競技程式常用的我全部歸在第一類，要學習這些技巧可以參考拙著"AP325"(免費講義，請搜尋臉書社團「APCS實作題」可以找到網址)，大致包括：陣列與字串操作、遞迴、排序與二分搜、STack and Queue、Greedy、DP、基本圖論演算法(BFS, DFS, topological sort)、Tree algorithms。AP325當初雖然是為了中學生與自學生所寫，但適用需要學習這部分技巧的人，該書雖以C++為主，但涉及算法層次時，與語言關係不大。
* 資料結構實作題：linked list與rooted binary tree (BST)。這類題目會給你定義好的class，要求你做一些操作。所以必須對這三類資料結構的操作方法有所了解。
* 集合與字典(Hash table)：LeetCode非常吃這兩個東西，出現的比例極高。這是跟一般競程不一樣的地方，競程這兩類用的少，但LeetCode大概強調實際面，所以這兩樣用得很多，所以C++或Python是比較好刷的。當然有些題目可以用離散化(座標壓縮)後的陣列方式替代，但會比較麻煩。
* 字串相關演算法：出現比例也非常高，基本的字串問題基本上與陣列相似，Python與C++ 也都有操作的指令。但LeetCode會用到一些字串的資料結構與演算法，例如字串的搜尋與Trie出現蠻多次。字串中搜尋字串，Python可以用內建的，但C++可能就要自己寫KMP或類似的演算法，另外rolling hash與Manacher algorithm也都有出現
* 各種奇怪暴搜+DP。LeetCode的難題很多是這一類的，特別是subset DP (like TSP)以及set partition DP (like graph coloring, bin packing)，需要知道使用bit來表達集合的相關的操作結合DP或Branching and Cut algorithm。



# 結語
LeetCode上的題目品質上算是不錯的，雖然有少數題目的描述(英文)不太好，但測資與答案的正確性與完整性算是不錯的，畢竟有這麼多人做過(有排名的帳號好像超過4百萬)，有錯也應該改好了，而且題目應該都是專業人士出的。
LeetCode不適合程式初學者，因為即使Easy可能也需要用到sort之類的東西。程式初學者可以去ZeroJudge之類的網站，那裏有些簡單的題目，但ZeroJudge的題目品質良莠不一，最好經過挑選，網路上可以找到一些題單或是找人指導。
高端的競程選手我也不太推薦LeetCode，因為缺乏一些競程深入技巧的題目。
競程入門者倒是可以來這裡練功。資工系教資料結構與演算法的老師讓學生來這做題目也是推薦的，跨行學程式要學習資料結構與算法的人，也是推薦的。

學習的方法因人而異，但不變的心法是：
學而不思則惘，思而不學則殆。
一昧的看別人的解法而不自己思考，則會很迷惘；只是悶著頭自己想解法而不去學習他人精妙的解法，則是很危險的。

---
作者介紹：吳邦一，學術專長為演算法的退休教授[學術著作](https://scholar.google.com.tw/citations?user=a0wbKRAAAAAJ&hl=en)，曾經參與程式比賽相關工作多年。2022年9月開始依照題號順序刷LeetCode當興趣，目前(2023/8)通過題數>1500，大多使用Python，因為Python比較適合老人。這一篇是以我的看法來介紹，所以也許不夠全面，偏重在演算法。
我退休後寫了一份講義AP325，簡單來說可以看做是競程初步，講義剛好325頁，裡面有一百多道題目，可以在臉書社團[APCS實作題檢測](https://www.facebook.com/groups/359446638362710/)中找到。
LeetCode有付費會員制，有些題目有些事情要付費會員才能做，我不是付費會員，所以本文介紹內容不含那個部分。

