【LeetCode 简单题】88-二进制手表

声明:

今天是第88道题。给定两个字符串 s 和 t,找2者不同的那个字母。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除

(手动比心ღ( ´・ᴗ・` ))

正文

题目:二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。

例如,上面的二进制手表读取 “3:25”。

给定一个非负整数 代表当前 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

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/83997599
今日推荐