[程式設計] LeetCode 介紹
簡介
這篇文章說明 LeetCode 的的使用方式。為什麼你要知道這個網站?因為這個網站收集了許多矽谷軟體公司的程式設計「面試」題目。因此在許多求職人的心中,份量十足。
由於台灣的潮流也是跟著美國在走,因此 LeetCode 在台灣軟體界的聲望,也是蠻高的。個人認為,業界對這些解題網站的認知,是 LeetCode >= UVa > CPE >= ITSA (純個人見解,不要戰我吶)。
因此若你有 LeetCode 的解題記錄,對於日後求職,是有一定的加分效果的。
在底下的說明中,我們就忽略「如何註冊」,「如何登入」這種較為簡單的問題,直接進入如何解題的部分!
開始解題
進入網站後,點選上面的 problems 選單,就可以進入問題清單。LeetCode網站,選擇 Problems 選項,瀏覽所有的題目 |
然後就會出現題目分類,以大一的程式設計來說,通常我們會選則 Algorithms 這個類別囉。當然也可以不選,直接看所有的題目。
LeetCode網站的題目分類 |
底下是題目的列表,由左到右是
- 編號
- 題目名稱,點擊名稱可以看題目的描述
- Solutions,這題的解答。如果真的解不出來,可以看一下解答,看看自己的盲點在那兒。
- 接受率:所有上傳中,通過的比率
- 難易度:以初學者來說,選 easy 來解,順便建立信心囉
- 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 的討論,看看其他人的程式碼,是可以獲益良多的。
留言
張貼留言