感觉彻底废了,好久没有做过面试题了。最近找回来了之前学习的状态,又开始在做面试题了。
题意
给了一个二进制显示时间的手表和一个非负整数 n, n 代表在给定时间表上 1 的数量, 返回所有可能的时间
注意事项
注意事项
输出的顺序没有要求.
小时不能包含前导零, 比如 "01:00" 是不允许的, 应该为 "1:00".
分钟必须由两位数组成, 可能包含前导零, 比如 "10:2" 是无效的, 应该为 "10:02".
样例
给出 n = 1
返回 ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
1.解题思路
说实话,楼主开始理解这个道题的题意花了很多的时间。这道题的意思就是:给出一个n值,表示1的个数,这个个数表示的是将答案转换成为二进制1的个数。例如,2:00这个转换成为二进制:10:00,所以2:00的1的个数为1。
这个道题楼主想到的是用快速幂的方式来求解每个数中的1的个数。
public List<String> binaryTime(int num) {
List<String> list = new ArrayList<>();
// 0 ~ 1259;
for (int i = 0; i < 1259; i++) {
int a = i % 100;
if (a >= 60) { //如果分钟大于等于60,不合法
continue;
}
int b = i / 100;
if(b >= 12) { //如果小时大于等于 12, 不合法
continue;
}
int sum = 0;
while (a != 0) {
if ((a & 1) == 1) {
sum++;
}
a >>= 1;
}
while (b != 0) {
if ((b & 1) == 1) {
sum++;
}
b >>= 1;
}
if (sum == num) {
StringBuilder stringBuilder = new StringBuilder(i + "");
//前位补0
if (stringBuilder.length() < 3) {
int length = stringBuilder.length();
for (int j = 0; j < 3 - length; j++) {
stringBuilder.insert(0, "0");
}
}
list.add(stringBuilder.insert(stringBuilder.length() - 2, ":").toString());
}
}
return list;
}