美文网首页
401-二进制手表

401-二进制手表

作者: 饮酒醉回忆 | 来源:发表于2019-07-19 11:35 被阅读0次

二进制手表

题目

二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。

每个 LED 代表一个 0 或 1,最低位在右侧。

例如,上面的二进制手表读取 “3:25”。

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

案例:

image

输入: n = 1
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]

注意事项:

输出的顺序没有要求。
小时不会以零开头,比如 “01:00”是不允许的,应为 “1:00”。
分钟必须由两位数组成,可能会以零开头,比如 “10:2”是无效的,应为 “10:02”。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-watch
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  • 思路一
    • 可以将小时和分钟重复遍历,找出当前时间点对应的二进制位有多少个1,此时就是符合条件的,输出即可.
  • 思路二
    • 领扣上看到的,将上下两个表盘的所有可能性列出.然后根据传入的num来依次判断,最后输出

代码

class Solution {
    public List<String> readBinaryWatch(int num) {
        //要计算所有的可能性,可以将小时和分钟的所有可能做循环,然后将当前点数的二进制值相加看有几个1,如果符合num,则对应输出时间
        List<String> result = new ArrayList<>();
        for(int i = 0;i < 12;i++){
            for(int h = 0;h < 60;h++){
                if((getNumForOne(i) + getNumForOne(h)) == num){
                    String hString = h<10?"0"+h:h+"";
                    result.add(i+":"+hString);
                }
            }
        }
        return result;
    }
    
    private int getNumForOne(int n){
        int sum = 0;
        for(int i = 0;i < 32;i++){
            if((1&(n>>i)) == 1){
                sum++;
            }
        }
        return sum;
    }
}

枚举法

class Solution {
    public List<String> readBinaryWatch(int num) {
        if (num > 8) {
            return new ArrayList<>();
        }

        String[] topZero = new String[]{"0"};
        String[] topOne = new String[]{"1", "2", "4", "8"};
        String[] topTwo = new String[]{"3", "5", "9", "6", "10"};
        String[] topThree = new String[]{"7","11"};

        String[] endZero = new String[]{":00"};
        String[] endOne = new String[]{":01", ":02", ":04", ":08", ":16", ":32"};
        String[] endTwo = new String[]{
                ":03", ":05", ":09", ":17", ":33",
                ":06", ":10", ":18", ":34",
                ":12", ":20", ":36",
                ":24", ":40",
                ":48"};
        String[] endThree = new String[]{
                ":07", ":11", ":19", ":35",
                ":13", ":21", ":37",
                ":25", ":41",
                ":49",
                ":14", ":22", ":38",
                ":26", ":42",
                ":50",
                ":28", ":44",
                ":52",
                ":56"};
        String[] endFour = new String[]{
                ":58", ":54", ":46", ":30",
                ":57", ":53", ":45", ":29",
                ":51", ":43", ":27",
                ":39", ":23",
                ":15"};

        String[] endFive = new String[]{":59", ":55", ":47", ":31"};


        List<String> result = new ArrayList<>();
        int hour = 0, minute = num - hour;
        while (hour < 4 && minute >= 0) {
            if (minute > 5) {
                hour++;
                minute = num - hour;
                continue;
            }
            String[] hourStr, minuteStr;
            switch (hour) {
                case 0: hourStr = topZero;break;
                case 1: hourStr = topOne;break;
                case 2: hourStr = topTwo;break;
                case 3: hourStr = topThree;break;
                default: hourStr = topZero;break;
            }

            switch (minute) {
                case 0: minuteStr = endZero;break;
                case 1: minuteStr = endOne;break;
                case 2: minuteStr = endTwo;break;
                case 3: minuteStr = endThree;break;
                case 4: minuteStr = endFour;break;
                case 5: minuteStr = endFive;break;
                default: minuteStr = endZero;break;
            }
            sum(result,hourStr,minuteStr);

            hour++;
            minute = num - hour;
        }
        return result;
    }
    
    private static void sum(List<String> result, String[] hour, String[] minute) {
        for (String h : hour) {
            for (String m : minute) {
                result.add(h+m);
            }
        }
    }
}   

相关文章

  • 401-二进制手表

    二进制手表 题目 二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-5...

  • 2021-05-04leetcode刷题

    401. 二进制手表[https://leetcode-cn.com/problems/binary-watch/...

  • 401. 二进制手表

    401. 二进制手表 1.想法 如果这个手表只有一个刻度,例如只有小时,那么直接做回溯,可以得到所有的结果但是现在...

  • LeetCode-python 401.二进制手表

    题目链接难度:简单 类型: 数学 二进制手表顶部有 4 个 LED 代表小时(0-11),底部...

  • 401-深度工作

    第一部分,剖析了大部分人无法深度工作的两个原因,分别是人们倾向于先做简单事的最小阻力原则和对于忙碌代表生产力的偏见...

  • 51.LeetCode.401. 二进制手表

    写在前面: 一天还是不能只做一件事,做实验做了一个多星期,身心变得好疲惫,效率也变低,豆豆又重新长回来,思路又变得...

  • 手表。手表?手表!

    周末下午陪儿子躺在床上玩,一晃儿小家伙已经6个半月了,他再也不是那个只知道吃奶、睡觉的奶娃娃了,看见新奇的东...

  • 【4班4组】 Day17 如何让读者更愿意转发你的文章?

    【学员信息】:401-老蓝-小作业8 【作业要求】:把下面例句改写得更能让读者觉得“这件事与我相关”。 (针对部分...

  • 【4班4组】+Day 2【真正有效的写作训练法】

    【学员信息】401-老蓝-小作业1 【作业要求】 描写自己的房间,篇幅200-300字。要求句子通顺,词汇精准,描...

  • 【4班4组】Day18 新媒体爆文写作整合流程

    【学员信息】:401-老蓝-大作业2 【作业要求】:根据模板(自选)仿写1篇爆文 【作业如下】: 对标模板《视觉志...

网友评论

      本文标题:401-二进制手表

      本文链接:https://www.haomeiwen.com/subject/dyejlctx.html