leetcode_401(二进制表)

一、题目大意

一个二进制手表顶端有4盏LED灯表示小时(0-11),底部有6盏LED灯表示分钟(0-59)。

每一盏LED灯表示一个0或1,最右端为最低位。

例如上图中的例子读数为”3:25”。

给定一个非负整数n表示当前燃亮的LED灯数,返回所有可能表示的时间。

注意:

输出顺序不重要。

小时不可以包含前缀0,例如”01:00”是无效的,应当为”1:00”。

分钟必须包含两位数字,可以包含前导0,例如”10:2”是无效的,应当为”10:02”。

二、分析:主要有一下三种方法

1,二进制法:是10位,最大1024,然后遍历,找二进制里面1的个数为满足要求的,然后判断是否超限,题目说的很清楚,小时0到11,分钟0到59,然后转化成要求的格式就行了。(python实现比较简单,python有很好的内置的函数)

2,正向遍历:对于一个num,每时针,分针点数的可能性进行遍历,然后组合即可。(例如num=5,时针2,分针3。就可以去找时针的2项子集,分针的3项子集,然后组合)

3,用数组记录一定数量灯亮的时候代表的是多少小时(分钟)。比如,
upLight[2].time存储的是上面2个灯亮的时候可能的小时数为3、5、9、6、10
downLight[2].time存储的是下面2个灯亮的时候可能的分钟数2、5、9、17、33、6、10、18、34、12、20、36、24、40、48。

三、java实现2,3方法
1,方法2

public class C401_2 {
    public static void main(String[] args) {
        int num = 2;
        List<String> res = readBinaryWatch(num);
        for(String s : res) {
            System.out.print("  " + s);
        }
    }


    static int[] hour = {1,2,4,8};
    static int[] minu = {1,2,4,8,16,32};
    static List<Integer> list = new ArrayList<>();
    static List<Integer> hs = new ArrayList<>();
    static List<Integer> ms = new ArrayList<>();

    public static List<String> readBinaryWatch(int num) {
        List<String> result = new ArrayList<>();
        for(int h=0;h<=num;h++) {
            dspCombination(hour,h, 0, true);
            dspCombination(minu, num-h, 0, false);
            for(int i:hs) {
                for(int j:ms) {
                    if(j<10)
                        result.add("" + i + ":0" + j);
                    else
                        result.add("" + i + ":" + j);
                }
            }
            hs.clear();
            ms.clear();
        }
        return result;
    }

    public static void dspCombination(int[] nums,int k,int level,boolean flag) {//找一种情况的子集
        if(list.size() == k) {
            int sum = 0;
            for(int num:list) {
                sum += num;
            }
            if(flag) {
                if(sum<=11)
                    hs.add(sum);
            }else {
                if(sum<=59)
                    ms.add(sum);
            }
            return;
        }else if(list.size() > k) {
            return;
        }else {
            for(int i=level;i<nums.length;i++) {
                list.add(nums[i]);
                dspCombination(nums, k, i+1, flag);
                list.remove(list.size()-1);
            }
        }
    }
}

2,方法3

static class light {
        List<Integer> time = new ArrayList<>();
    }
    private static light[] hours = new light[5];//4盏灯表示小时,可以亮0,1,2,3,4盏
    private static light[] minutes = new light[7];//6盏灯表示分钟,可以亮0,1,2,3,4,5,6盏

    public static List<String> readBinaryWatch(int num) {
        List<String> result = new ArrayList<>();
        init(11, hours);
        init(59, minutes);
        for(int up =0;up<=num && up <= 4;up++) {//如果亮num盏,可以分为时针亮up盏,分针亮down盏
            int down = num -up;
            for(int hour : hours[up].time) {
                if(down < 7 ) {
                    for(int minute : minutes[down].time) {
                        if(minute >= 10)
                            result.add("" + hour + ":" + minute);
                        else
                            result.add("" + hour + ":0" + minute);
                    }
                }
            }
        }
        return result;
    }
    public static void init(int k,light[] light) {//把每个小时或分钟划分到相应的灯数上,例如4点钟是由1个灯表示
        for(int i=0;i<light.length;i++) {
            light[i] = new light();
        }
        for(int i=0;i <= k;i++) {
            int t = i;
            int cnt = 0;
            while(t>0) {
                if(t%2 == 1) cnt++;
                t >>= 1;
            }
            light[cnt].time.add(i);
        }
    }

3,方法3(直接)

public static List<String> readBinaryWatch2(int num) {
        int[][] H = {{0},{1,2,4,8},{3,5,9,6,10},{7,11},{}};
        int[][] M = {{0},{1,2,4,8,16,32},
                {3,5,6,9,10,12,17,18,20,24,33,34,36,40,48},
                {7,11,13,14,19,21,22,25,26,28,35,37,38,41,42,44,49,50,52,56},
                {15,23,27,29,30,39,43,45,46,51,53,54,57,58},
                {31,47,55,59},{}};
        List<String> result = new ArrayList<>();
        for(int up =0;up<=num && up <= 4;up++) {//将
            int down = num -up;
            for(int hour : H[up]) {
                if(down < 7 ) {
                    for(int minute : M[down]) {
                        if(minute >= 10)
                            result.add("" + hour + ":" + minute);
                        else
                            result.add("" + hour + ":0" + minute);
                    }
                }
            }
        }
        return result;
    }

四、python实现

class Solution(object):
    def readBinaryWatch(self, num):
        """
        :type num: int
        :rtype: List[str]
        """
        ans=[]
        for h in range(12):
            for m in range(60):
                if(bin(h) + bin(m)).count('1') == num:
                    ans.append('%d:%02d' % (h,m))

        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值