【leetcode】二进制手表c++

本文探讨如何利用二进制表示法解决二进制手表LED亮灯问题,通过C++代码实现,介绍__builtin_popcount函数的应用,并对比了暴力法和优化后的代码效率。讨论了如何根据给定亮灯数量找出所有可能的时间组合。
摘要由CSDN通过智能技术生成

题目描述:
二进制手表顶部有 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的个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值