声明:
今天是第88道题。给定两个字符串 s 和 t,找2者不同的那个字母。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:二进制手表顶部有 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”。
解法1。注意根据题意,该手表是12小时制的手表,也就是说上面4个小时的灯不可能全亮,最大也就是1011的情况,所以设置2个变量分别为时h和分m,遍历所有组合的情况,判断条件就是其二进制1的个数相加等于输入的num,代码如下。
- (bin(h)+bin(m)).count('1'):这里2个bin相加是类似于字符串的连接,不是数学上的加法
执行用时: 28 ms, 在Binary Watch的Python提交中击败了95.59% 的用户
class Solution(object):
def readBinaryWatch(self, num):
"""
:type num: int
:rtype: List[str]
"""
res = []
for h in range(12):
for m in range(60):
if (bin(h)+bin(m)).count('1') == num:
res.append("%d:%02d"%(h,m))
return res
解法2。一共10位,范围就是0-1023,所以遍历这1024个数,找到合理的数(小时数小于12,分钟数小于60且满足对应二进制数中1的个数等于num),代码如下。
执行用时: 28 ms, 在Binary Watch的Python提交中击败了95.59% 的用户
class Solution(object):
def readBinaryWatch(self, num):
"""
:type num: int
:rtype: List[str]
"""
res = []
for i in range(1024):
if bin(i).count('1') == num:
h, m = i>>6, i&0x3f # 分别取i的高4位即小时位,和i的低6位即分钟位
if h < 12 and m < 60:
res.append("%d:%02d"%(h,m))
return res
结尾
解法1&解法2:https://blog.csdn.net/u012965373/article/details/53317141