题目
https://www.lintcode.com/problem/706
给了一个二进制显示时间的手表和一个非负整数 n, n 代表在给定时间表上 1 的数量, 返回所有可能的时间
输出的顺序没有要求.
小时不能包含前导零, 比如 "01:00" 是不允许的, 应该为 "1:00".
分钟必须由两位数组成, 可能包含前导零, 比如 "10:2" 是无效的, 应该为 "10:02".
hour < 12, minute < 60
样例
样例1
输入: 1
输出: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
样例2
输入: 2
输出: ["0:03","0:05","0:06","0:09","0:10","0:12","0:17","0:18","0:20","0:24","0:33","0:34","0:36","0:40","0:48","10:00","1:01","1:02","1:04","1:08","1:16","1:32","2:01","2:02","2:04","2:08","2:16","2:32","3:00","4:01","4:02","4:04","4:08","4:16","4:32","5:00","6:00","8:01","8:02","8:04","8:08","8:16","8:32","9:00"]
思路
读懂题意很重要,本题和力扣401题是一样的,请先去力扣401题读懂题意本地小时0到11,分钟为0到59,因此小时只需要4为表示即可,分钟需要6位表示
解题思路:直接枚举0到11小时内没分支的小时和分钟,检查二进制1的个数,
如果1的个数等于参数,就添加进结果集
答案
public class Solution {
/**
* @param num: the number of "1"s on a given timetable
* @return: all possible time
* we will sort your return value in output
*/
public List<String> binaryTime(int num) {
//看懂题目很关键,力扣401题和本题一样,请去力扣看懂题目再做
//非常易懂的答案https://leetcode.cn/problems/binary-watch/solutions/7818/401er-jin-zhi-shou-biao-integerbitcount-fa-easyti-/
//暴力枚举12个小时的时间,检查二进制中的1,注意,题目规定,小时小于12【hour < 12, minute < 60】
//记录0.。。59的每一个数的二进制个数,也可以用Integer.bitCount函数直接获得
//我没用库函数,自己求出每个数的二进制1的个数。其他语言同样适用
int[] bitscnt = new int[60];
for (int i = 1; i <60 ; i++) {
int cnt = 0;
for (int j = 31; j >=0 ; j--) {
int a = (i&(1<<j)) ==0 ?0:1;
if(a ==1) cnt++;
}
bitscnt[i] = cnt;
}
List<String> ans = new ArrayList<>();
for (int i = 0; i <12 ; i++) {
for (int j = 0; j <60 ; j++) {
if(bitscnt[i]+bitscnt[j] == num){
String cur = i+":"+(j<10?"0":"")+j;
ans.add(cur);
}
}
}
return ans;
}
}