2017.10.24
/**小时数中,最多可以包含3个1;小时数最多为4位,
* 分钟数中,最多可以包含5个1;分钟数最多有6位;
* 所以num的数量不可以大于8
*/
建立map,分别计算1~60的二进制表示中,有几个1;
然后根据num对小时和分钟中1的含量进行划分, 最后再组合就可以
public class Solution {
/*
* @param : the number of "1"s on a given timetable
* @return: all possible time
*/
public List<String> binaryTime(int num) {
// Write your code here
/**小时数中,最多可以包含3个1;小时数最多为4位,
* 分钟数中,最多可以包含5个1;分钟数最多有6位;
* 所以num的数量不可以大于8
*/
LinkedList<String> res = new LinkedList<>();
if(num >= 9){
return res;
}
if(num == 0){
res.add("0:00");
return res;
}
HashMap<Integer,LinkedList<String>> map= new HashMap<>();
map = bulidMap(map);
for(int i = 0; i <= 4; i++){
if(num - i >= 6 || num -i < 0){
continue;
}
LinkedList<String> hour = map.get(i);
LinkedList<String> min = map.get(num - i);
Iterator itr1 = hour.iterator();
while(itr1.hasNext()){
String h = (String)itr1.next();
if(Integer.valueOf(h) >= 12){
continue;
}
Iterator itr2 = min.iterator();
while(itr2.hasNext()){
String m = (String)itr2.next();
if(m.length() == 1){
m = "0"+m;
}
res.add(h + ":" + m);
}
}
}
return res;
}
public HashMap<Integer,LinkedList<String>> bulidMap(HashMap<Integer,LinkedList<String>> map){
for(int i = 0; i <= 5; i ++){
LinkedList<String> list = new LinkedList<String>();
map.put(i, list);
}
for(int i = 0; i < 60; i++){
String s = Integer.toBinaryString(i);
int count = 0;
for(int j = 0; j < s.length();j++){
if(s.charAt(j) == '1'){
count++;
}
}
map.get(count).add(Integer.toString(i));
}
return map;
}
};