leetcode401. 二进制手表

版权声明:本文为博主原创文章,转载请注明出处 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;
    }

}

猜你喜欢

转载自blog.csdn.net/love905661433/article/details/85299879
今日推荐