题目大意
二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。
每个 LED 代表一个 0 或 1,最低位在右侧。
例如,上面的二进制手表读取 “3:25”。
给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间。
案例:
输入: n = 1
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
方法一:bitCount
Java中Integer.bitCount()函数可以统计int,long类型二进制中1的个数。
public List<String> readBinaryWatch(int num) {
List<String> res = new ArrayList<>();
for(int i=0;i<12;i++) {
for(int j=0;j<60;j++) {
if(Integer.bitCount(i)+Integer.bitCount(j)==num)
res.add(String.format("%d:%02d",i,j));
}
}
return res;
}
运行时间16ms,击败34.06%。
方法二:暴力法
列举出所有的小时数和分针数,然后将其组合。
public List<String> readBinaryWatch(int num) {
List<String> res = new ArrayList<String>();
int hhs[][] = {{0},{8,4,2,1},{3,5,9,6,10},{7,11}};
int mms[][] = {{0},{1,2,4,8,16,32},
{3,5,9,17,33,6,10,18,34,12,20,36,24,40,48},
{7,11,19,35,13,21,37,25,41,49,14,22,38,26,42,50,28,44,52,56},
{15,23,39,27,43,51,29,45,53,57,30,46,54,58},
{31,47,55,59}};
for(int i=0;i<=num && i<=3;i++) {
int j = num-i;
if(j>=0 && j<=5) { //需要分钟参与
for(int hh:hhs[i])
for(int mm:mms[j])
res.add(String.format("%d:%02d",hh,mm));
}
}
return res;
}