二进制手表顶部有 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 }