二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。 例如,下面的二进制手表读取 "3:25" 。

给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。 小时不会以零开头: 例如,"01:00" 是无效的时间,正确的写法应该是 "1:00" 。 输入:turnedOn = 1 输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
class Solution {
List<String> res=new ArrayList();//存放结果
public List<String> readBinaryWatch(int turnedOn) {
int used[] =new int[10];
dfs(turnedOn,used,0);
return res;
}
public void dfs(int turnedOn,int[] used,int cur){//开灯剩余数量 模拟灯的数组 1开灯 0关灯 cur代表当前要开灯的地方
if(turnedOn==0){
int hour=1*used[0]+2*used[1]+4*used[2]+8*used[3];
int minute=1*used[4]+2*used[5]+4*used[6]+8*used[7]+16*used[8]+32*used[9] ;
if(hour<12&&minute<60){
res.add(format(hour,minute));
}
}
for(int i=cur;i<used.length;i++){//因为开灯的地方,每一个点都有可能
used[i]=1;
dfs(turnedOn-1,used,i+1);//开灯数量-1, 要开灯的地方+1,防止开重复了
used[i]=0;//回溯
}
}
public String format(int hour,int minute){//返回指定格式 hour:minute
StringBuilder sb=new StringBuilder();
sb.append(hour+":");
if(minute<10){
sb.append("0");
sb.append(minute);
}else{
sb.append(minute);
}
return sb.toString();
}
}