lintcode 706 · 二进制手表【中等 二进制】

题目

https://www.lintcode.com/problem/706

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

输出的顺序没有要求.
小时不能包含前导零, 比如 "01:00" 是不允许的, 应该为 "1:00".
分钟必须由两位数组成, 可能包含前导零, 比如 "10:2" 是无效的, 应该为 "10:02".
hour < 12, minute < 60
样例
样例1

输入: 1
输出: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
样例2

输入: 2
输出: ["0:03","0:05","0:06","0:09","0:10","0:12","0:17","0:18","0:20","0:24","0:33","0:34","0:36","0:40","0:48","10:00","1:01","1:02","1:04","1:08","1:16","1:32","2:01","2:02","2:04","2:08","2:16","2:32","3:00","4:01","4:02","4:04","4:08","4:16","4:32","5:00","6:00","8:01","8:02","8:04","8:08","8:16","8:32","9:00"]

思路

读懂题意很重要,本题和力扣401题是一样的,请先去力扣401题读懂题意
本地小时0到11,分钟为0到59,因此小时只需要4为表示即可,分钟需要6位表示
解题思路:直接枚举0到11小时内没分支的小时和分钟,检查二进制1的个数,
如果1的个数等于参数,就添加进结果集

答案

public class Solution {
    /**
     * @param num: the number of "1"s on a given timetable
     * @return: all possible time
     *          we will sort your return value in output
     */
    public List<String> binaryTime(int num) {
        //看懂题目很关键,力扣401题和本题一样,请去力扣看懂题目再做
       //非常易懂的答案https://leetcode.cn/problems/binary-watch/solutions/7818/401er-jin-zhi-shou-biao-integerbitcount-fa-easyti-/
        //暴力枚举12个小时的时间,检查二进制中的1,注意,题目规定,小时小于12【hour < 12, minute < 60】

        //记录0.。。59的每一个数的二进制个数,也可以用Integer.bitCount函数直接获得
        //我没用库函数,自己求出每个数的二进制1的个数。其他语言同样适用
        int[] bitscnt = new int[60];
        for (int i = 1; i <60 ; i++) {
            int cnt = 0;
            for (int j = 31; j >=0 ; j--) {
                int a = (i&(1<<j)) ==0 ?0:1;
                if(a ==1) cnt++;
            }

            bitscnt[i] = cnt;
        }

        List<String> ans = new ArrayList<>();
        for (int i = 0; i <12 ; i++) {
            for (int j = 0; j <60 ; j++) {
                if(bitscnt[i]+bitscnt[j] == num){
                    String cur = i+":"+(j<10?"0":"")+j;
                    ans.add(cur);
                }
            }
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵长辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值