题目描述:
二进制手表顶部有 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
暴力法 代码:
#include<sstream>
class Solution {
public:
vector<string> readBinaryWatch(int turnedOn) {
vector<string> t;
for(int i=0;i<12;i++){ //所有可能的小时
for(int j=0;j<60;j++){ //所有可能的分钟
if(num(i)+num(j)==turnedOn){ //若用二进制表示的位数之和 = 给出的数
if(j<10)t.push_back(int2string(i)+":"+"0"+int2string(j)); //保存结果(分钟<10,补0)
else t.push_back(int2string(i)+":"+int2string(j));
}
}
}
return t;
}
string int2string(int n){
stringstream ss;
string m;
ss<<n;
ss>>m;
return m;
}
int num(int n){
int s=0;
while(n!=0){
int m=n%2;
if(m==1)s=s+1;
n=n/2;
}
return s;
}
};
题目LED显示灯的本质是二进制表示中1的个数。
直接遍历所有可能的小时和分钟,若它们的二进制表示中1的总数为给定的turnedOn,则保存时间结果。
时间复杂度O(1)
改进:
#include<sstream>
class Solution {
public:
vector<string> readBinaryWatch(int turnedOn) {
vector<string> t;
for(int i=0;i<12;i++){ //所有可能的小时
for(int j=0;j<60;j++){ //所有可能的分钟
if(__builtin_popcount(i)+__builtin_popcount(j)==turnedOn){ //若用二进制表示的位数之和 = 给出的数
t.push_back(to_string(i)+":"+(j<10?"0":"")+to_string(j)); //保存结果(分钟<10,补0)
}
}
}
return t;
}
};
int转string用库函数to_string(),求十进制数的二进制表示中1的个数用库函数__builtin_popcount(),不用自己再写函数,减少函数调用。
总结:
①c11中可以使用函数to_string(x)把int型x转为string型
②__builtin_popcount(x)可以求十进制数x的二进制表达中1的个数