401. 二进制手表

401. 二进制手表

难度简单271

二进制手表顶部有 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

思路:本题的数据量很小,没有必要想琐碎的优化,更应该注重代码的可读性。直接枚举小时和分钟,判断二进制位数是否符合题意即可。

class Solution {
public:

    int lowbit(int num)
    {
        return num & (-num);
    }

    int getBits(int num)
    {
        int bits_num = 0;
        while(num)
        {
            ++ bits_num;
            num -= lowbit(num);
        }
        return bits_num;
    }

    string int2string(int num, bool isHour)
    {
        if(num >= 10)
        {
            string time;
            while(num)
            {
                time.append(1, '0' + num % 10);
                num /= 10;
            }
            reverse(time.begin(), time.end());
            return time;
        }
        else
        {
            if(isHour)
            {
                if(num == 0) return "0";
                else return string(1, '0' + num); 
            }
            else
            {
                if(num == 0) return "00";
                else return "0" + string(1, '0' + num); 
            }
        }
        
        
        
        
    }

    vector<string> readBinaryWatch(int turnedOn) {
        //枚举小时与分钟 判断二进制个数是否满足要求即可
        vector<string> times;
        int hour, minute, hourBits;
        for(hour = 0; hour <= 11; ++ hour)
        {
            hourBits = getBits(hour);
            for(minute = 0; minute <= 59; ++ minute)
            {
                if(getBits(minute) + hourBits == turnedOn)
                {
                    times.push_back(int2string(hour, true) + ":" + int2string(minute, false));
                }
            }
        }
        return times;
    }
};

注:本题还可以枚举10个二进制位每一个的状态,在枚举的过程中判断一下时间的合法性即可,但是小时虽然占4位二进制,但是合法状态只有0~11,分钟占用6位二进制,但是合法状态只有0~59,因此直接枚举小时和分钟比较好。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值