题目描述
二进制手表顶部有 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”。
超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现 “13:00”, “0:61” 等时间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-watch
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
思路一:遍历。从0:00遍历到11:59,利用 Integer.bitCount() 方法或者是自己写的方法分别检测小时和分钟含1的个数,如果和为num则添加至答案列表中。
思路二:递归回溯(很麻烦,也不好想到)。这里引用Leetcode里 XYFS 大神的图与思路,并赋上链接:点击这里(侵删)。
代码详解
思路一:遍历
class Solution {
public List<String> readBinaryWatch(int num) {
List<String> list = new ArrayList<>(); // 存放时间的数组,即答案
// 特殊情况
if(num == 0) {
list.add("0:00");
return list;
} else if(num == 10 || num == 9