401 二进制手表(枚举、位运算)

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值