401. 二进制手表

Posted yfs123456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

以上是关于401. 二进制手表的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 401. Binary Watch(二进制手表)

401. 二进制手表

401. 二进制手表

401. 二进制手表

401. 二进制手表 Binary Watch

[M模拟] lc401. 二进制手表(模拟+位运算技巧+sprintf()技巧+二进制枚举)