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:

在上述範例中

因此,你需要做的事情,只有根據參數算好解答後再回傳回去,如下:

class Solution:
	def addOne(self, num: int) -> int:
		return num + 1

如果你寫完後覺得沒有問題,則可以先用 Run 功能跑跑看範例測資,真的沒問題後再用 Submit 正式送出,讓 LeetCode 平台用更多測資測試你的程式。在 LeetCode 平台上,要用 Submit 送出並取得 Accepted 後,才算是完成解題,其中 Accepted 俗稱 AC。而若你的程式有問題,則可能會拿到下列結果:

如果程式比較複雜,使得你想要在繳送前,在自己的電腦上先做測試的話,則首先必須使用「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