leetcode 401 二進位制手錶

2022-08-20 02:51:10 字數 2347 閱讀 2633

[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...