[程式設計] LeetCode 介紹

簡介

這篇文章說明 LeetCode 的的使用方式。



為什麼你要知道這個網站?因為這個網站收集了許多矽谷軟體公司的程式設計「面試」題目。因此在許多求職人的心中,份量十足。

由於台灣的潮流也是跟著美國在走,因此 LeetCode 在台灣軟體界的聲望,也是蠻高的。個人認為,業界對這些解題網站的認知,是 LeetCode >= UVa > CPE >= ITSA (純個人見解,不要戰我吶)。

因此若你有 LeetCode 的解題記錄,對於日後求職,是有一定的加分效果的。

在底下的說明中,我們就忽略「如何註冊」,「如何登入」這種較為簡單的問題,直接進入如何解題的部分!




開始解題

進入網站後,點選上面的 problems 選單,就可以進入問題清單。

LeetCode網站,選擇 Problems 選項,瀏覽所有的題目

然後就會出現題目分類,以大一的程式設計來說,通常我們會選則 Algorithms 這個類別囉。當然也可以不選,直接看所有的題目。

LeetCode網站的題目分類

底下是題目的列表,由左到右是

  1. 編號
  2. 題目名稱,點擊名稱可以看題目的描述
  3. Solutions,這題的解答。如果真的解不出來,可以看一下解答,看看自己的盲點在那兒。
  4. 接受率:所有上傳中,通過的比率
  5. 難易度:以初學者來說,選 easy 來解,順便建立信心囉
  6. Frequency 我就不清楚作用了,這需要註冊為專屬會員並付錢才有的功能。

題目細節

點擊題目名稱,就可以進入觀看題目的描述。最重要的是 Description 頁囉。這題說明了題目的要求,有什麼樣的輸入,還有輸出。

底下的說明以 Two Sum 為例,這題是簡單題。

LeetCode 題目解說頁的說明

解說頁的下面是可以輸入程式碼的地方。細節見下圖說明。

輸入方塊的 run code 可以執行你的程式碼。系統會餵一些 test data 給你,讓你初步判定程式是否正確。

藍色的 submit solution 則是正式的上傳程式碼。這時就會輸入一大堆的 test case,最後回報是否有通過所有的測試。

Leetcode的編輯區說明

實地練習

那就實地練習囉。我們以 two sum 為例。

這題的題目是說, 給一個一維陣列,還有一個整數 target。

在陣列中找到兩個數,這兩個數的相加,恰好為 target。

題目也說,假設一個輸入,只有一個解答。而且同一個資料不可以用到兩次。

下面是 leetcode 給的範例。在這個例子中,target 為 9,陣列為 [2, 7, 11, 15]。

輸出為 [0, 1],因為 nums[0] + nums[1] 為 target = 9。

LeetCode網站中,對 two sum 這個問題的示範例題


下圖是 leetcode 給的程式碼範本。

請注意,這個範本中的「類別名稱」,函式的宣告的部分,都不可以更改。

也就是說,你不可以把類別名稱由 Solution 改為 ABC 之類的。

也不可以修改函式的宣告,例如把 twoSum 的回傳值改為 int 囉。

LeetCode 給的程式樣板

函式 vector<int> twoSum(vector<int>& nums, int target) 的意思很明顯,傳入一個 vector nums,還有一個整數 target。

nums 就是題目要求的一維陣列,而 target 就是要求的 target。

回傳值則是一個 vector,記錄了兩個 index i 及 j,其滿足 nums[i] + nums[j] == target。

依題意,我們可以寫出底下的程式碼。


但是,我們要怎麼測試我們的程式碼對不對呢?我們可以在底下加入測試的程式碼,如底下的程式碼所示:

類別 Solution 底下我們加入一個 main 函式 (25-34 行),裏面放入測試的程式碼。將這段程式碼放在自己的 IDE 中 (不要放在 leetcode 中測喔,在自己的 IDE 中測),看看跑出來的結果是不是符合結果。

注意,上面程式碼 27 行,是 C++11 後新增的初始化 vector 方式喔。

vector<int> nums = { 2, 7, 11, 15 };

第 30 行是先建構一個 Solution 物件 (匿名物件),然後直接呼叫裏面的 twoSum 函式,並將 nums 以及 target 都傳給它。

最後 twoSum 回傳的 vector 會被放在變數 r 中。我們在 31-33 行中將 r 的內容印出來。

測試及上傳

完成後,在程式碼區貼上 class Solution 的程式碼 ( main 不用貼)。之後按 run code 鈕測一下。

基本上 leetcode 會跑一個測資,並且秀出測試的結果。如果沒問題的話,就按藍色的 submit solution 上傳囉。

如果你看到綠色的 Accepted,那就是對了。你也可以按一下 More Details 看看你寫的這個程式碼執行的詳細狀況。

程式碼被 LeetCode 接受的畫面

以我的程式碼為例,這支程式通過了 19 個測試資料,執行時間是 219ms。

這是快還是慢呢?底下的直方圖顯示並不是很好,在全部通過的程式碼中,我只勝過了 11.78%。看起來還有很大的最佳化空間。

Two sum 程式碼在 LeetCode 網站的測試結果


如果在大公司的求職中,面試官可能會追問你要如何讓程式碼再更最佳化,例如節省更多的空間,或是執行得更快。這時候就是您要花腦筋想想的囉。

結論

這篇文章談到了什麼是 leetcode,為什麼你要使用 leetcode,以及如何使用 leetcode 方式。

我個人覺得 leetcode 不只是在刷題目,另一個重點則是看看國外 engineer 的討論,看看其他人的程式碼,是可以獲益良多的。


留言

這個網誌中的熱門文章

由 Pandas 的 DataFrame 中取得資料

[程式設計] C++ 的字串切割

[C++]在 cin 後呼叫 getline 所遇到的問題