leetcode 401. Binary Watch二进制手表

问题描述:

  A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59).

  Each LED represents a zero or one, with the least significant bit on the right.


这里写图片描述

  For example, the above binary watch reads “3:25”.

  Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent.

Example:

  Input: n = 1
  Return: [“1:00”, “2:00”, “4:00”, “8:00”, “0:01”, “0:02”, “0:04”, “0:08”, “0:16”, “0:32”]

Note:

  The order of output does not matter.
  The hour must not contain a leading zero, for example “01:00” is not valid, it should be “1:00”.
  The minute must be consist of two digits and may contain a leading zero, for example “10:2” is not valid, it should be “10:02”.

方法一:

  小时和分钟可以分为两个部分,情况种类是有限的,小时不能超过11,分钟不能超过59,可以通过列举的方法把所有可能的情况列出来,然后将亮灯的数量分配到小时和分钟,得到所有的结果,这是最简单粗暴的一种方式,我第一个想到的就是这种方法。

代码一:

class Solution {
    public List<String> readBinaryWatch(int num) {
        List<String> result = new ArrayList<String>();
        int hours[][] = {{0},{8,4,2,1},{3,5,9,6,10},{7,11}};
        int minutes[][] = {{0},{1,2,4,8,16,32},
                {3,5,9,17,33,6,10,18,34,12,20,36,24,40,48},
                {7,11,19,35,13,21,37,25,41,49,14,22,38,26,42,50,28,44,52,56},
                {15,23,39,27,43,51,29,45,53,57,30,46,54,58},
                {31,47,55,59}};

        for(int i = 0; i <= num && i <= 3; i++){
            if((num - i) >= 0 && (num - i) <= 5){
                for(int j : hours[i]){
                    for(int k : minutes[num-i]){
                        if(k<10)
                            result.add(j+":0"+k);
                        else 
                            result.add(j+":"+k);
                    }
                }
            }
        }       
        return result;  
    }
}

方法二:

  可以采用遍历的方法。小时从0到11,分钟从0到59,检查每个时间点的亮灯数量,数量正好为所给参数时,将其放入list列表。这需要考察一个整型数以二进制形式表示时1的个数。可以利用Java中的Integer.bitCount(int)函数。

代码二:

class Solution {
    public List<String> readBinaryWatch(int num) {
        List<String> result = new ArrayList<String>();
        for(int i = 0; i < 12; i++){
            for(int j = 0; j < 60; j++){
                if(Integer.bitCount((i << 6) + j)==num)
                //或者写作 if(Integer.bitCount(i)+Integer.bitCount(j)==num)
                    result.add(String.format("%d:%02d", i,j));
            }
        }       
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值