Easy
题目描述
给你一个长度为 5 的字符串 time,表示一个数字时钟上的当前时间,格式为 "hh:mm"。最早可能的时间是 "00:00",最晚可能的时间是 "23:59"。
在字符串 time 中,由 ? 表示的数字是未知的,必须用 0 到 9 中的数字替换。
请你返回一个整数 answer,将每个 ? 都用 0 到 9 中的一个数字替换后,一共能得到多少个有效的时钟时间。
示例 1:
输入:time = "?5:00"
输出:2
解释:我们可以将 ? 替换成 0 或 1,得到 "05:00" 或者 "15:00"。注意我们不能替换成 2,因为时间 "25:00" 是无效的。总共有两种选择。
示例 2:
输入:time = "0?:0?"
输出:100
解释:每个 ? 都可以被 0-9 之间的任意数字替换,所以我们总共有 100 种选择。
示例 3:
输入:time = "??:??"
输出:1440
解释:小时有 24 种可能的选择,分钟有 60 种可能的选择。总共有 24 * 60 = 1440 种选择。
提示:
time是一个长度为 5 的有效字符串,格式为"hh:mm""00" <= hh <= "23""00" <= mm <= "59"- 一些数字可能被
?替换,需要用0到9的数字替换
解题思路
这道题需要统计将所有 ? 替换为数字后能形成多少个有效的时钟时间。
核心思路: 分别统计小时部分和分钟部分的可能选择数,然后相乘得到总数。
小时部分分析(hh):
- 如果都不是
?:只有 1 种选择 - 如果第一位是
?:需要根据第二位确定范围- 第二位是
0-3:第一位可以是0,1,2(3种) - 第二位是
4-9:第一位只能是0,1(2种) - 第二位也是
?:需要枚举所有00-23(24种)
- 第二位是
- 如果第二位是
?:需要根据第一位确定范围- 第一位是
0,1:第二位可以是0-9(10种) - 第一位是
2:第二位只能是0-3(4种)
- 第一位是
分钟部分分析(mm):
- 如果都不是
?:只有 1 种选择 - 如果第一位是
?:可以是0-5(6种) - 如果第二位是
?:可以是0-9(10种) - 如果都是
?:总共6×10=60种选择
推荐解法: 按位分析法,逻辑清晰且易于实现。
代码实现
class Solution {
public:
int countTime(string time) {
int hours = 1, minutes = 1;
// 计算小时的可能数
if (time[0] == '?' && time[1] == '?') {
hours = 24; // 00-23
} else if (time[0] == '?') {
if (time[1] >= '0' && time[1] <= '3') {
hours = 3; // 0, 1, 2
} else {
hours = 2; // 0, 1
}
} else if (time[1] == '?') {
if (time[0] == '0' || time[0] == '1') {
hours = 10; // 0-9
} else { // time[0] == '2'
hours = 4; // 0-3
}
}
// 计算分钟的可能数
if (time[3] == '?' && time[4] == '?') {
minutes = 60; // 00-59
} else if (time[3] == '?') {
minutes = 6; // 0-5
} else if (time[4] == '?') {
minutes = 10; // 0-9
}
return hours * minutes;
}
};
class Solution:
def countTime(self, time: str) -> int:
hours = 1
minutes = 1
# 计算小时的可能数
if time[0] == '?' and time[1] == '?':
hours = 24 # 00-23
elif time[0] == '?':
if time[1] in '0123':
hours = 3 # 0, 1, 2
else:
hours = 2 # 0, 1
elif time[1] == '?':
if time[0] in '01':
hours = 10 # 0-9
else: # time[0] == '2'
hours = 4 # 0-3
# 计算分钟的可能数
if time[3] == '?' and time[4] == '?':
minutes = 60 # 00-59
elif time[3] == '?':
minutes = 6 # 0-5
elif time[4] == '?':
minutes = 10 # 0-9
return hours * minutes
public class Solution {
public int CountTime(string time) {
int hours = 1, minutes = 1;
// 计算小时的可能数
if (time[0] == '?' && time[1] == '?') {
hours = 24; // 00-23
} else if (time[0] == '?') {
if (time[1] >= '0' && time[1] <= '3') {
hours = 3; // 0, 1, 2
} else {
hours = 2; // 0, 1
}
} else if (time[1] == '?') {
if (time[0] == '0' || time[0] == '1') {
hours = 10; // 0-9
} else { // time[0] == '2'
hours = 4; // 0-3
}
}
// 计算分钟的可能数
if (time[3] == '?' && time[4] == '?') {
minutes = 60; // 00-59
} else if (time[3] == '?') {
minutes = 6; // 0-5
} else if (time[4] == '?') {
minutes = 10; // 0-9
}
return hours * minutes;
}
}
var countTime = function(time) {
let hours = 1, minutes = 1;
// 计算小时的可能数
if (time[0]
复杂度分析
| 复杂度类型 | 复杂度 |
|---|---|
| 时间复杂度 | O(1) |
| 空间复杂度 | O(1) |