lintcode--二进制时间

给定一个二进制手表和非负整数 n,表示手表上 1 的数量,求所有可能的时间。小时不能有前导零,分钟必须是两位,可能含有前导零。例如,n = 1 时,返回 ['1:00', '2:00', '4:00', '8:00', '0:01', '0:02', '0:04', '0:08', '0:16', '0:32']。" 90710484,7816740,CoDo:一站式开源DevOps平台详解,"['运维咖啡吧', 'devops', 'opendevops', '平台']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
给了一个二进制显示时间的手表和一个非负整数 n, n 代表在给定时间表上 1 的数量, 返回所有可能的时间。

注意事项:
输出的顺序没有要求.
小时不能包含前导零, 比如 “01:00” 是不允许的, 应该为 “1:00”.
分钟必须由两位数组成, 可能包含前导零, 比如 “10:2” 是无效的, 应该为 “10:02”.

样例:
给出 n = 1
返回 [“1:00”, “2:00”, “4:00”, “8:00”, “0:01”, “0:02”, “0:04”, “0:08”, “0:16”, “0:32”]

思路讲解:
首先我们弄懂什么是二进制手表,通常的二进制手表用4位二进制表示小时,4位二进制可以表示0~15,但表示小时的只用0~12:0000~1100,LED点亮表示1,熄灭表示0;用6位二进制表示分钟,6位二进制可以表示0~63,但表示分钟的只用0~59:000000~111011,仍然是LED点亮表示1,熄灭表示0。
这里写图片描述
故我们可以简化这个手表,就是一个10位的二进制,前六位为分钟,后四位为小时,题目说1的个数,这样我们就可以利用深度搜索,递归在10个位置中放置1,

代码详解:

class Solution {
public:
    /*
     * @param : the number of "1"s on a given timetable
     * @return: all possible time
     */
    vector<string> binaryTime(int num) {
        // Write your code here
        vector<int>watch;
        for(int i=0;i<10;i++){
            watch.push_back(0);
        }
        vector<string>res;
        findtime(watch,res,0,num,0);
        return res;

    }
    void findtime(vector<int>&watch,vector<string>&res,int index,int num,int count)
    {
        if(count==num){//找到满足条件的时间,将其加入数组中
            if(array_to_time(watch)!=""){
                res.push_back(array_to_time(watch));
            }
            return;
        }
        for(int i=index;i<10;i++){
            watch[i]=1;
            findtime(watch,res,i+1,num,count+1);
            watch[i]=0;
        }
    }
    string array_to_time(vector<int>res)
    {
        int min=0;
        int hour=0;
        for(int i=0;i<6;i++){
            min=min+pow(2,i)*res[i];
        }
        for(int i=6;i<10;i++){
            hour=hour+pow(2,i-6)*res[i];
        }
        if(hour>=12||min>=60){//由于时间是在0:00--11:59之间,超过这个的就排除掉
            string s="";
            return s;
        }
        if(min<10){//由于分钟必须由两位数组成, 可能包含前导零,故min小于10时,我们需要在其前面加0
            string s="";
            s=s+to_string(hour)+":0"+to_string(min);
            return s;
        }else{
            string s="";
            s=s+to_string(hour)+":"+to_string(min);
            return s;
        }
    }
    void printvector(vector<int>res){
        for(int i=0;i<res.size();i++){
            cout<<res[i]<<" ";
        }
        cout<<endl;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值