LeetCode 是一個可以讓你用各種程式語言,練習解答各種題目的地方,並且原則上是撰寫函式來解答,不需要像 UVa Online Judge 或 ZeroJudge 一樣自己讀取使用者的輸入。本篇將說明使用 Python 語言解答題目時的相關原則。
首先要注意的是語言選項。LeetCode 的語言選項提供了 Python 和 Python3;以目前(2024/09)來說,Python 選項的版本是 Python 2.7,而 Python3 是 Python 3.11。如果你要選擇 Python3,則其函式架構會包含 type hints,即輸入和輸出的參數類型提示;但 type hints 的部份狀況在較早版本並未完整支援,若要在送出之前在自己電腦上測試的話,可能需要留意;而若你要選擇 Python 選項,則可能需要注意除法的規則不同(Python 2 的除法,在兩邊都是整數時,會把商的小數丟掉),以及部分內建函式尚未支援(例如 math.gcd)等問題。本篇將以 Python3 選項為主來解說。
LeetCode 的架構規則,會有一個 Solution 物件,其中包含一個指定了名稱和參數的函式。以一個「把輸入數字加一」的範例題目來說,LeetCode 可能會告訴你,函式名稱要叫做「addOne」,輸入參數可能只有一個 n,如下:
class Solution: def addOne(self, num: int) -> int:在上述範例中,物件名稱、函式名稱,以及參數列表都會由題目給定,你不應該對他們做任何修改。
因此,你需要做的事情是根據參數算好解答後再回傳回去,如下:
class Solution: def addOne(self, num: int) -> int: return num + 1如果要對你寫好的程式做測試,首先必須使用「S = Solution()」建立一個物件,並在呼叫一般函式的方法前面加上「S.」來測試。整段程式可以撰寫在全域範圍,也可以包含在「if __name__ == '__main__':」裡面,但建議包含在「if __name__ == '__main__':」裡面,比較不會影響 LeetCode 平台的自動評分,如下:
class Solution: def addOne(self, num: int) -> int: return num + 1 if __name__ == '__main__': S = Solution() print(S.addOne(123))撰寫及測試完成後,送出至 LeetCode 時,可以只複製 class 區塊並貼上,也可以連「if __name__ == '__main__':」一起複製並貼上。
如果你在解題時需要用到遞迴,則有多種方法可以使用,但以撰寫全域函式最為簡單,以下以階乘來做示範:
def factorial(n): if n == 1: return 1 return n * factorial(n - 1) class Solution(object): def factorial(self, num): return factorial(num) if __name__ == '__main__': S = Solution() print(S.factorial(5))在上述範例中,我們在物件內外使用了一樣的函式名稱,但是 Python 會自動幫你判別是物件內或物件外的函式,因此不會造成語法錯誤。當然,以此種方式撰寫時,必須連同物件外的函式一起送出至 LeetCode 的平台。