题目:
二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。
解析:
有两种做法,本质一样,写法不同。
第一种,遍历所有可能时间,看看1的个数。当1的个数等于num,则保存该时间。值得注意的是如何获得二进制值1的个数,之前的题目也有用到这个技巧。
第二种,递归,深度回溯。有些复杂了。只看了题解。
- 第一种
class Solution:
def readBinaryWatch(self, num: int) -> List[str]:
res = []
def count(i):
res = 0
while i != 0:
i = i & (i - 1)
res += 1
return res
for i in range(12):
c = count(i)
if c == num:
res.append("%d:%02d" %(i, 0))
continue
for j in range(60):
s = count(j)
if (s + c) == num:
res.append("%d:%02d" %(i, j))
return res
- 第二种方法,从题解处复制来的。
每亮起一盏灯,都从后面搜索所有可能性(for循环内部用递归函数)
```def readBinaryWatch(self, num: int) -> List[str]:
hour = [1, 2, 4, 8]
minute = [1, 2, 4, 8, 16, 32]
h_len, m_len = len(hour), len(minute)
res = []
def time(combination, led, start):
if led == 0:
if combination[1] < 10:
res.append(str(combination[0]) + ':0' + str(combination[1]))
else:
res.append(str(combination[0]) + ':' + str(combination[1]))
else:
for i in range(start, h_len + m_len):
if i < h_len:
combination[0] += hour[i]
if combination[0] < 12:
time(combination, led - 1, i + 1)
combination[0] -= hour[i]
else:
combination[1] += minute[i - h_len]
if combination[1] < 60:
time(combination, led - 1, i + 1)
combination[1] -= minute[i - h_len]
cur = [0] * 2
time(cur, num, 0)
return res
作者:WiseMove
链接:https://leetcode-cn.com/problems/binary-watch/solution/python3di-gui-hui-su-by-wisemove/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。