概述
题目
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。
给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。
小时不会以零开头:
例如,“01:00” 是无效的时间,正确的写法应该是 “1:00” 。
分钟必须由两位数组成,可能会以零开头:
例如,“10:2” 是无效的时间,正确的写法应该是 “10:02” 。
官方解法
非常巧妙,使用了c++中的函数–__builtin_popcount,这一函数统计数值对应二进制数据1的个数。因此把问题直接转化成为一个很简单的问题。遍历整个时间,符合要求的输出即可。
官方代码
class Solution {
public:
vector<string> readBinaryWatch(int turnedOn) {
vector<string> ans;
for (int h = 0; h < 12; ++h) {
for (int m = 0; m < 60; ++m) {
if (__builtin_popcount(h) + __builtin_popcount(m) == turnedOn) {
ans.push_back(to_string(h) + ":" + (m < 10 ? "0" : "") + to_string(m));
}
}
}
return ans;
}
};
个人思路
时针4bit,分针6bit,一共是10bit,一共1024种可能。将1024种可能性遍历。同时保证能够满足钟表的要求和“1”数量要求。
个人代码
class Solution {
public:
int countone(int num){
int sum=0;
while(num!=0){
num=num&(num-1);
sum++;
}
return sum;
}
vector<string> readBinaryWatch(int turnedOn) {
vector<string> out;
for(int i=0;i<1024;i++){
int h=i>>6;
int h1;
int m=i&63;
int m1;
int sum=0;
if(h<12&&m<60){
h1=countone(h);
m1=countone(m);
sum = h1+m1;
if(sum == turnedOn){
out.push_back(to_string(h)+":"+(m>=10?"":"0")+to_string(m));
}
}
}
return out;
}
};
思考
int count1(int n) {
int res = 0;
while (n != 0) {
n = n & (n - 1);
res++;
}
return res;
}
题解区看到一个这样的代码,实现了统计数字中的i的个数。
题中要求时针要0~11,所以判定条件要小于12,这个位置错了一次。
最后
以上就是清新镜子为你收集整理的【刷题笔记】3、二进制手表,力扣-401官方解法官方代码个人思路个人代码思考的全部内容,希望文章能够帮你解决【刷题笔记】3、二进制手表,力扣-401官方解法官方代码个人思路个人代码思考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复