LeetCode 是一個可以讓你用各種程式語言,練習解答各種題目的地方,並且原則上是撰寫函式來解答,不需要像 UVa Online Judge 或 ZeroJudge 一樣自己讀取使用者的輸入。本篇將說明使用 Python3 語言解答題目時的相關原則。
首先要注意的是語言選項。實際上,LeetCode 的語言選項提供了 Python 和 Python3;以目前(2024/09)來說,Python 選項的版本是 Python 2.7,而 Python3 是 Python 3.11。本篇將以 Python3 選項為主來解說。如果你需要選擇使用 Python (2.7),則必須注意除法的規則不同(Python 2 的除法,在兩邊都是整數時,會把商的小數丟掉),以及部分內建函式尚未支援(例如 math.gcd)等問題。
LeetCode 的架構規則,會有一個 Solution 物件,其中包含一個指定了名稱和參數的函式。以一個「把輸入數字加一」的範例題目來說,LeetCode 會在頁面上的程式碼的編輯區告訴你,函式名稱要叫做「addOne」,輸入參數可能只有一個 n,如下:
class Solution: def addOne(self, num: int) -> int:在上述範例中
- 「: int」和「 -> int」是 type hints,即輸入和輸出的參數類型提示。
- 物件名稱、函式名稱,以及參數列表都會由題目給定,除非你很熟悉自己在做什麼,否則不應該對他們做任何修改。
- 對 LeetCode 上的多數題目來說,你只需要專注在函式的撰寫即可,不需要認識多少物件的相關語法就可以解題,因此本篇章以下的內容中,對於物件相關的語法,只會告訴各位「是這樣使用」,而不會多做說明。
因此,你需要做的事情,只有根據參數算好解答後再回傳回去,如下:
class Solution: def addOne(self, num: int) -> int: return num + 1如果你寫完後覺得沒有問題,則可以先用 Run 功能跑跑看範例測資,真的沒問題後再用 Submit 正式送出,讓 LeetCode 平台用更多測資測試你的程式。在 LeetCode 平台上,要用 Submit 送出並取得 Accepted 後,才算是完成解題,其中 Accepted 俗稱 AC。而若你的程式有問題,則可能會拿到下列結果:
- Wrong Answer (WA):回傳結果錯誤,代表你的程式有些邏輯不周全。
- Time Limit Exceeded (TLE):程式跑太久,代表你的計算方法或實作細節需要改良。
- Memory Limit Exceeded (MLE):程式佔用太多記憶體,代表你的計算方法或實作細節需要改良。
- Runtime Error (RE):程式執行中產生錯誤,例如除以 0,或者串列索引超出範圍等等。
如果程式比較複雜,使得你想要在繳送前,在自己的電腦上先做測試的話,則首先必須使用「S = Solution()」建立一個物件,並在呼叫一般函式的方法前面加上「S.」來測試;其中的 S 是變數名稱,因此你可以依據變數命名規則,改取一個自己喜歡的名字。測試用的程式可以撰寫在沒有縮排的全域範圍,如下:
class Solution: def addOne(self, num: int) -> int: return num + 1 S = Solution() print(S.addOne(123))測試完成沒有問題後,就可以把 class 的部份,複製到 LeetCode 頁面的編輯區,執行 Run 或者 Submit。
但如果你除了將物件繳送到 LeetCode 以外,也會需要把程式碼傳給他人(例如職場上的合作夥伴,或者批改作業的老師)使用的話,則建議把自行測試的相關程式碼,包含在「if __name__ == '__main__':」裡面,比較不會影響對方的使用,如下:
class Solution: def addOne(self, num: int) -> int: return num + 1 if __name__ == '__main__': S = Solution() print(S.addOne(123))如果你在解題時,需要撰寫額外的函式來包裝一些功能,則有多種方法可以使用,但以撰寫全域函式最為簡單,如下:
def my_add(a, b): return a + b class Solution: def addOne(self, num: int) -> int: return my_add(num, 1) if __name__ == '__main__': S = Solution() print(S.addOne(123))當然,以此種方式撰寫時,必須將物件跟物件外的函式一起送出。
有一些較進階的 type hints,需要 import 特定函式庫才能使用;這在 LeetCode 平台上會預設幫你 import,但若要在送出之前在自己電腦上測試的話,會需要自己 import,串列就屬於這一類的 type hints。下列是一個函式輸入參數有串列的範例,如果你直接複製貼上在自己的電腦上執行,會出現「NameError: name 'List' is not defined.」這樣的錯誤訊息,你可以試著在最開頭加上「from typing import List」,或者把「L」改成小寫來處理,或者乾脆手動移除 type hints:
class Solution: def myTest(self, nums: List[int]) -> int: pass