[401] 二進位制手錶
algorithms
easy (48.85%)
likes: 73
dislikes: 0
total accepted: 5.2k
total submissions: 10.6k
testcase example: '0'
二進位制手錶頂部有 4 個 led 代表小時(0-11),底部的 6 個 led 代表分鐘(0-59)。
每個 led 代表乙個 0 或 1,最低位在右側。
例如,上面的二進位制手錶讀取 「3:25」。
給定乙個非負整數 n 代表當前 led 亮著的數量,返回所有可能的時間。
案例:輸入: n = 1
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16",
"0:32"]
注意事項:
輸出的順序沒有要求。
小時不會以零開頭,比如 「01:00」 是不允許的,應為 「1:00」。
分鐘必須由兩位數組成,可能會以零開頭,比如 「10:2」 是無效的,應為 「10:02」。
from typing import list
class solution:
def __init__(self):
self.result_all = none
self.nums = [1, 2, 4, 8, 1, 2, 4, 8, 16, 32] # 對應的 [0-9] 個選項中的字
self.visited = [0 for _ in range(len(self.nums))] # 記錄已訪問過的元素
def readbinarywatch(self, num: int) -> list[str]: # 指定返回值為list[str]型別
self.result_all =
self.__dfs(num, 0, 0)
return self.result_all
def __dfs(self, num, step, start): # dfs 回溯,引數變數:step -> 遞迴深度,start -> 可選擇項的開始位置 (組合類回溯,常用)
if step == num: # 到達葉子節點,無返回值dfs,在葉子節點結算
for i in range(start, len(self.nums)): # * 注意 start 變數, 組合類 回溯,避免重複
self.visited[i] = 1 # 先設定已訪問
if not self.__is_vaild(): # 剪枝,判斷是否滿足需求
self.visited[i] = 0
continue
self.__dfs(num, step + 1, i + 1) # 進入下一次遞迴,step深度加1,開始位置加1
self.visited[i] = 0 # 回溯點
def __is_vaild(self): # 判斷是否為有效值
sum_h = 0
sum_m = 0
for i in range(len(self.visited)):
if not self.visited[i]:
continue
if i < 4:
sum_h += self.nums[i]
else:
sum_m += self.nums[i]
return sum_h <= 11 and sum_m <= 59
def __handler(self): # 處理結果,題目要求的輸出格式
sum_h = 0
sum_m = 0
for i in range(len(self.visited)):
if not self.visited[i]:
continue
if i < 4:
sum_h += self.nums[i]
else:
sum_m += self.nums[i]
result = str(sum_h) + ":"
if sum_m < 10:
result += "0" + str(sum_m)
else:
result += str(sum_m)
return result
# if __name__ == "__main__":
# print(solution().readbinarywatch(1))
LeetCode 401 二進位制手錶
二進位制手錶頂部有 4 個 led 代表小時 0 11 底部的 6 個 led 代表分鐘 0 59 每個 led 代表乙個 0 或 1,最低位在右側。解題思路 我自己想到的解法是用dfs去搜尋滿足條件的組合,然後看完 william 用暴力解法,解法也比較好,這裡都記錄一下。先看自己的解法。我的解法...
leetcode 401 二進位制手錶
思路一 遞迴回溯 使用乙個長度為10的陣列進行組合編碼,最終輸出時間 思路二 兩重for迴圈分別代表小時和分鐘 class solution for int i index ireadbinarywatch int num class solution return ret 1.bitset bit...
LeetCode 401 二進位制手錶
問題描述 二進位制手錶頂部有 4 個 led 代表小時 0 11 底部的 6 個 led 代表分鐘 0 59 每個 led 代表乙個 0 或 1,最低位在右側。例如,上面的二進位制手錶讀取 3 25 給定乙個非負整數 n 代表當前 led 亮著的數量,返回所有可能的時間。案例 輸入 n 1 返回 1...