题目
https://leetcode-cn.com/problems/binary-watch/
代码
方法一:枚举
class Solution {
public List<String> readBinaryWatch(int turnedOn) {
List<String> ans = new ArrayList<String>();
for (int h = 0; h < 12; ++h) {
for (int m = 0; m < 60; ++m) {
if (Integer.bitCount(h) + Integer.bitCount(m) == turnedOn) {
ans.add(h + ":" + (m < 10 ? "0" : "") + m);
}
}
}
return ans;
}
}
方法二:二进制枚举
class Solution {
public List<String> readBinaryWatch(int turnedOn) {
List<String> ans = new ArrayList<String>();
for (int i = 0; i < 1024; ++i) {
int h = i >> 6, m = i & 63; // 用位运算取出高 4 位和低 6 位
if (h < 12 && m < 60 && Integer.bitCount(i) == turnedOn) {
ans.add(h + ":" + (m < 10 ? "0" : "") + m);
}
}
return ans;
}
}
超时的方法
回溯
class Solution {
ArrayList<String> list;
int[] hours={1,2,4,8};
int[] minutes={1,2,4,8,16,32};
public List<String> readBinaryWatch(int turnedOn) {
list=new ArrayList<>();
int hour=0;
int minute=0;
dfs(hour,minute,turnedOn);
return list;
}
public void dfs(int hour,int minute,int turnedOn){
if(turnedOn==0){
//拼装
StringBuilder sb=new StringBuilder("");
if(hour==0){
sb.append("0");
}
else{
sb.append(String.valueOf(hour));
}
sb.append(":");
if(minute>=10){
sb.append(String.valueOf(minute));
}
else if(minute>0&&minute<10){
sb.append("0");
sb.append(String.valueOf(minute));
}
else{
sb.append("00");
}
list.add(sb.toString());
return;
}
for(int i=0;i<hours.length;i++){
hour+=hours[i];
turnedOn--;
dfs(hour,minute,turnedOn);
hour-=hours[i];
turnedOn++;
}
for(int j=0;j<minutes.length;j++){
minute+=minutes[j];
turnedOn--;
dfs(hour,minute,turnedOn);
minute-=minutes[j];
turnedOn++;
}
}
}