Google – Binary Clock
有一个用binary code来表示的clock, 比如10:15可以表示为1010:1111,每个bit是一个小灯泡。
题目是input一个n,输出所有能用n盏灯表示的时间。
比如n = 0的话,只有零点(00:00)一种可能。
[Solution]
backtracking题.
首先得问清楚是12小时制还是24小时制。如果是24小时制,那么小时部分最多可能有5位(10111 = 23),分钟部分最多可能有6位(1111011 = 59)
所以最多只能有9盏灯亮,也就是n不能大于9. 但是递归的时候可以开一个5 + 6 = 11位的数组,当小时或分钟不合法之后再backtracking就好了。
Read full article from Google – Binary Clock
有一个用binary code来表示的clock, 比如10:15可以表示为1010:1111,每个bit是一个小灯泡。
题目是input一个n,输出所有能用n盏灯表示的时间。
比如n = 0的话,只有零点(00:00)一种可能。
[Solution]
backtracking题.
首先得问清楚是12小时制还是24小时制。如果是24小时制,那么小时部分最多可能有5位(10111 = 23),分钟部分最多可能有6位(1111011 = 59)
所以最多只能有9盏灯亮,也就是n不能大于9. 但是递归的时候可以开一个5 + 6 = 11位的数组,当小时或分钟不合法之后再backtracking就好了。
public
List<String> timesWithNLights(
int
n) {
List<String> result =
new
ArrayList<>();
if
(n <
0
|| n >
9
) {
return
result;
}
if
(n ==
0
) {
result.add(
"0:0"
);
return
result;
}
int
[] clock =
new
int
[
11
];
backtracking(clock, n,
0
, result);
return
result;
}
private
void
backtracking(
int
[] clock,
int
n,
int
pos, List<String> result) {
if
(n ==
0
) {
int
h =
0
;
int
m =
0
;
for
(
int
i =
10
; i >=
0
; i--) {
if
(i >
4
&& clock[i] ==
1
) {
m += (
1
<< (
10
- i));
}
if
(i <=
4
&& clock[i] ==
1
) {
h += (
1
<< (
4
- i));
}
}
if
(h <=
23
&& m <=
59
) {
result.add(String.valueOf(h) +
":"
+ String.valueOf(m));
}
return
;
}
int
i = pos;
while
(i < clock.length) {
clock[i] =
1
;
n--;
backtracking(clock, n, i +
1
, result);
n++;
clock[i] =
0
;
i++;
}
}