二进制手表顶部有 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”。
解法1遍历可能出现的情况
class Solution {
public List<String> readBinaryWatch(int num) {
List<String> res = new ArrayList<>();
for(int i = 0;i < 12;i++){
for(int j = 0;j < 60;j++){
if(count(i) + count(j) == num){
if(j < 10){
res.add(i+":0"+ j);
}else{
res.add(i+":"+ j);
}
}
}
}
return res;
}
public int count(int num){
int res = 0;
while(num != 0){
num = num & (num - 1);
res++;
}
return res;
}
}
解法2:dfs
class Solution {
int[] clock = {8, 4, 2, 1, 32, 16, 8, 4, 2, 1};
int[] book = new int[10];
List<String> res = new ArrayList<>();
public List<String> readBinaryWatch(int num) {
dfs(num, 0);
return res;
}
public void dfs(int num,int cur){
if(num == 0){
int hour = 0,minute = 0;
for(int i = 0;i < 4;i++){
hour += book[i] * clock[i];
}
for(int i = 4;i < 10;i++){
minute += book[i] * clock[i];
}
if(hour < 12 && minute < 60){
res.add(String.format("%d:%02d", hour, minute));
}
return;
}else{
for(int i = cur;i < 10;i++){
if(book[i] == 0){
book[i] = 1;
dfs(num - 1,i + 1);
book[i] = 0;
}
}
}
}
}