版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/love905661433/article/details/85299879
题目
二进制手表顶部有 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"]
注意事项:
- 输出的顺序没有要求。
- 小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。
- 分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。
解题
- 递归 + 回溯
- 需要注意表示小时的灯最多只能亮3个, 表示分钟的灯最多只能亮5个
- 小时数要小于12, 分钟小于60
class Solution {
private int[] hours = new int[]{1, 2, 4, 8};
private int[] minutes = new int[]{1, 2, 4, 8, 16, 32};
List<String> result = new ArrayList<>();
public List<String> readBinaryWatch(int num) {
List<Integer> tempHours;
for (int h = 0, m = num - h; h < 4 && h <= num; ) {
// 表示分钟的灯最多亮5个
if (m < 0 || m > 5){
h++;
m--;
continue;
}
tempHours = new ArrayList<>();
// 获取表示小时的灯h个灯亮时能够表示的所有小时数
getHour(h, 0, 0, tempHours);
for (int i = 0; i < tempHours.size(); i++) {
// 表示分钟数的灯有m个灯亮时能够表示的多有分钟数, 结合小时数组成时间
getMinute(m, 0, 0, tempHours.get(i));
}
h++;
m--;
}
return result;
}
// 获取hourNum个灯亮时能表示的全部小时说
private void getHour(int hourNum, int index, int sum, List<Integer> tempHours){
if (hourNum == 0) {
if (sum < 12) {
tempHours.add(sum);
}
return;
}
for (int i = index; i < 4; i++) {
sum += hours[i];
getHour(hourNum - 1, i + 1, sum, tempHours);
// 回溯
sum -= hours[i];
}
}
// minuteNum个灯亮时能够表示的全部分钟数, 结合小时说组成时间
private void getMinute(int minuteNum, int index, int sum, int hour){
if (minuteNum == 0) {
if (sum < 60) {
result.add(hour + formatMinute(sum));
}
return;
}
for (int i = index; i < 6; i++) {
sum += minutes[i];
getMinute(minuteNum - 1, i + 1, sum, hour);
// 回溯
sum -= minutes[i];
}
}
// 分钟格式化
private String formatMinute(int minute) {
if (minute == 0) {
return ":00";
}
if (minute < 10) {
return ":0" + minute;
}
return ":" + minute;
}
}