1. 问题描述:
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
例如,下面的二进制手表读取 "3:25" 。
给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以按任意顺序返回答案。
小时不会以零开头:
例如,"01:00" 是无效的时间,正确的写法应该是 "1:00" 。
分钟必须由两位数组成,可能会以零开头:
例如,"10:2" 是无效的时间,正确的写法应该是 "10:02" 。
示例 1:
输入:turnedOn = 1
输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
示例 2:
输入:turnedOn = 9
输出:[]
提示:
0 <= turnedOn <= 10
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-watch
2. 思路分析:
总共有10个灯每个灯表示一个二进制位所以我们可以枚举10位二进制数字,计算二进制位中1的数目,这里可以使用右移位运算来计算当前数字的二进制表示中1的数目s,判断当前1的数目s是否等于亮的灯的数目,如果相等那么计算出当前的数字的二进制表示的前4位与后6位数字,前4位可以通过右移操作得到,后6位可以和63相与的位运算得到,63表示6个1,也即可以得到后6位的数字,判断得到的小时与分钟是否满足条件如果满足条件,因为分钟有可能是0所以还需要格式化一下分钟(python使用format函数进行格式化)最后返回结果即可。
3. 代码如下:
from typing import List
class Solution:
def readBinaryWatch(self, turnedOn: int) -> List[str]:
res = list()
# 看成是二进制计算有多少个1即可
for i in range(1 << 10 + 1):
# s表示当前数字的二进制表示1的数目
s = 0
# 计算当前i的二进制表示中1的数目
for j in range(10):
if i >> j & 1 == 1:
s += 1
if s == turnedOn:
# a保留高4位
a = i >> 6
# 获取后6位
b = i & 63
if a <= 11 and b <= 59:
a = str(a)
b = "{:0>2d}".format(b)
res.append(a + ":" + b)
return res