leetcode
leetcode 2101 ~ 2150
有效时间的数目

有效时间的数目

难度:

标签:

题目描述

代码结果

运行时间: 22 ms, 内存: 16.1 MB


/*
 * 使用Java Stream的思路:
 * 1. 利用Stream对每个可能的替换情况进行组合和过滤。
 * 2. 生成所有可能的时间组合,并筛选出合法的时间。
 */

import java.util.stream.IntStream;

public class Solution {
    public long countValidTimes(String time) {
        return IntStream.range(0, 24)
                .mapToObj(h -> String.format("%02d", h))
                .flatMap(h -> IntStream.range(0, 60)
                        .mapToObj(m -> h + ":" + String.format("%02d", m)))
                .filter(t -> isValidTime(t, time))
                .count();
    }

    private boolean isValidTime(String t, String time) {
        for (int i = 0; i < time.length(); i++) {
            if (time.charAt(i) != '?' && time.charAt(i) != t.charAt(i)) {
                return false;
            }
        }
        return true;
    }
}

解释

方法:

这个题解的思路是通过分析每个位置的字符是否为 '?' 并根据电子时钟的有效时间范围来确定该位置可以取的有效数字个数。对于小时的第一位,如果是 '?',则需要根据小时的第二位来确定第一位可以取的值。如果小时第二位也是 '?',则小时可以是 00 到 23,共有 24 种情况。如果小时第二位是确定的数字,则第一位的值取决于第二位的值;例如,如果第二位小于等于 3,则第一位可以是 0, 1, 2(三种情况)。对于分钟,每个位置 '?' 都有独立的 0-9 十种可能性,因此可以直接计算。整体上,解法通过对不同情况进行判断和乘法来计算总的有效时间数。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
在题解中提到,如果小时的第一位和第二位都是 '?' 时,可以有 24 种可能的小时数。这是怎样计算得到的?
在24小时制中,小时数的范围是从00到23,总共有24个有效的小时数。当小时的第一位和第二位都是 '?' 时,这意味着这两位可以任意组合来表示任何从00到23的数,因此总共有24种可能的组合方式。
🦆
题解中提及如果小时的第二位小于等于 3,则第一位小时数可以取 0, 1, 2。如果第二位是 4 或更大,第一位只能取 0 或 1。这是基于什么规则?
这是基于24小时制中小时的最大值为23的规则。如果小时的第二位数字小于等于3,那么第一位可以安全地取0, 1, 或2,因为如20, 21, 22, 23都是有效的小时数。但是,如果第二位数字是4或更大,第一位不能取2,因为24, 25等不是有效的小时数。因此,第一位只能取0或1,如04, 14等是有效的。
🦆
题解中对分钟的处理,如果分钟的第一个数字是 '?',则假设它可以取 0 到 5。这个范围是如何确定的,它与分钟的第二位数字有关系吗?
分钟的表示必须在00到59之间。分钟的第一个数字取0到5的范围是因为分钟的十位最高不能超过5,例如59是有效的,而60是无效的。这个范围与分钟的第二位数字无关,因为无论第二位数字是什么,第一位数字都应该限制在0到5之间。
🦆
如果小时的第一位是 2 而第二位是 '?',为什么第二位只能是 0 到 3,不能是 4 到 9?
在24小时制中,当小时的第一位为2时,有效的小时数只能是20到23。如果第二位数字是4到9,如24, 25, 29等,这些都不是有效的小时数。因此,当第一位数字是2时,第二位数字只能从0到3中选择,以确保时间的有效性。

相关问题