难度简单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,因此直接枚举小时和分钟比较好。