题目:略
思路:本题的实质在于,在一个集合中选取算法的实现。可以将亮灯的数量,分为两个部分:小时灯的数量、分钟灯的数量
难点:集合中选区一定数量的元素的实现(递归),递归函数的参数有:需要选取的集合,最后输出返回的集合, 递归结束的标志,递归中循环的起始位置,放入返回集合的中间存储变量。详情见代码。
code:
import java.util.*;
class Solution {
public List<String> readBinaryWatch(int num) {
if(num == 0) return Arrays.asList("0:00");
List<String> list = new ArrayList<>();
List<Integer> hour = Arrays.asList(1,2,4,8);
List<Integer> min = Arrays.asList(1,2,4,8,16,32);
for(int i=0;i<=num;i++){
List<Integer> lh = helper(i,hour);
List<Integer> lm = helper(num-i,min);
for(int h:lh){
if(h>11) continue;
for(int m:lm){
if(m>59) continue;
list.add(String.valueOf(h)+String.format(":%02d",m));
}
}
}
return list;
}
private List<Integer> helper(int num,List<Integer> time){
List<Integer> res = new ArrayList<>();
getNum(time,res,num,0,0);
return res;
}
private void getNum(List<Integer> time,List<Integer> res,int num,int pos,int o){
if(num == 0) {
res.add(o);
return;
}
for(int i=pos;i<time.size();i++){
getNum(time,res,num-1,i+1,o+time.get(i));
}
}
}
补充:格式化字符串的用法:
用0补齐:String.valueOf(h)+String.format(":%02d",m);%02d占位符,表示一个整数如果不足两位,就用0补齐
【参考】 String.format