我是靠谱客的博主 清新镜子,最近开发中收集的这篇文章主要介绍【刷题笔记】3、二进制手表,力扣-401官方解法官方代码个人思路个人代码思考,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目
二进制手表顶部有 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官方解法官方代码个人思路个人代码思考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部