有效时间的数目
难度:
标签:
题目描述
代码结果
运行时间: 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 种可能的小时数。这是怎样计算得到的?
▷🦆
题解中提及如果小时的第二位小于等于 3,则第一位小时数可以取 0, 1, 2。如果第二位是 4 或更大,第一位只能取 0 或 1。这是基于什么规则?
▷🦆
题解中对分钟的处理,如果分钟的第一个数字是 '?',则假设它可以取 0 到 5。这个范围是如何确定的,它与分钟的第二位数字有关系吗?
▷🦆
如果小时的第一位是 2 而第二位是 '?',为什么第二位只能是 0 到 3,不能是 4 到 9?
▷