??感覺徹底廢了呢簸,好久沒有做過面試題了。最近找回來了之前學習的狀態(tài)讳窟,又開始在做面試題了窘俺。
題意
給了一個二進制顯示時間的手表和一個非負整數(shù) n, n 代表在給定時間表上 1 的數(shù)量, 返回所有可能的時間
注意事項
注意事項
輸出的順序沒有要求.
小時不能包含前導零, 比如 "01:00" 是不允許的, 應該為 "1:00".
分鐘必須由兩位數(shù)組成, 可能包含前導零, 比如 "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的個數(shù)灶泵,這個個數(shù)表示的是將答案轉換成為二進制1的個數(shù)。例如对途,2:00這個轉換成為二進制:10:00赦邻,所以2:00的1的個數(shù)為1。
??這個道題樓主想到的是用快速冪的方式來求解每個數(shù)中的1的個數(shù)掀宋。
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;
}