• 401. 二进制手表


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

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

     

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

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

    案例:

    输入: 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 public class Solution {
     2     /*
     3     坑1:
     4         【小时位置】的范围是0-11,这需要注意,即四个灯不能全亮。
     5         【分钟位置】同理,分钟位置也有同样的限制。
     6      坑2:
     7         小时不能以0开头,但分钟可以。
     8 
     9      思路:
    10         小时和分钟都有多种亮灯数量。
    11         如小时2个,分钟3个。小时位置和分钟位置并无关联,它们只受固定范围的约束。
    12         两层循环解决问题。第一层遍历小时的可能情况,第二层遍历分钟的可能情况。若范围符合,则添加解。
    13         【注意】小时可以占用全部的灯,分钟都不亮即可。
    14 
    15         小时和分钟的序列可以通过一个二进制数来表示,该数字的十进制表示就是对应的小时数或分钟数。
    16         小时和分钟序列的变更可以通过二进制数自增实现,若超过范围限制就continue。
    17         需要有专门的函数来获取二进制数中1的个数,即亮灯数量。
    18 
    19      @param num: 亮灯个数
    20      */
    21     private int getCount(int num){
    22         int cnt = 0, b = 1;
    23         for (int i = 1; i <= 6; i++) {
    24             if ((num & b) > 0)
    25                 cnt++;
    26             b = b << 1;
    27         }
    28         return cnt;
    29     }
    30 
    31     public List<String> readBinaryWatch(int num) {
    32         List<String> res = new ArrayList<>();
    33 
    34         for (int i = 0; i < 12; i++) { // 小时
    35             int hourNum = getCount(i); // 获取小时位置亮灯个数
    36             for (int j = 0; j < 60; j++) { // 分钟
    37                 int minuteNum = getCount(j); // 获取分钟位置的亮灯个数
    38                 if (hourNum + minuteNum > num)
    39                     continue;
    40                 if (hourNum + minuteNum == num) {
    41                     if (j < 10)
    42                         res.add(i + ":0" + j);
    43                     else
    44                         res.add(i + ":" + j);
    45                 }
    46             }
    47         }
    48         return res;
    49     }
    50 
    51     public static void main(String[] args) {
    52         List<String> list = new Solution().readBinaryWatch(2);
    53         for (String e : list) {
    54             System.out.println(e);
    55         }
    56     }
    57 }
  • 相关阅读:
    IOS开发mapkit学习笔记
    IOS的两种框架设计思想
    关于创建及使用多线程的几种方法
    Linux基础入门 之挑战:历史命令
    20172018网络攻防第三周
    20172018网络攻防第二周
    Linux基础入门实验楼挑战之数据提取
    iconfont字体图标的使用方法超简单!
    CSS中的绝对定位(absolute)误区
    获取对象属性的点方法和中括号法的区别
  • 原文地址:https://www.cnblogs.com/yfs123456/p/11619440.html
Copyright © 2020-2023  润新知