有效时间的数目

标签: 字符串 枚举

难度: 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 之间的数字替换。

Submission

运行时间: 22 ms

内存: 16.1 MB

class Solution:
    def countTime(self, time: str) -> int:
        cnt = 1
        if time[0] == "?":
            if time[1] == "?":
                cnt *= 24
            elif int(time[1]) <= 3:
                cnt *= 3
            else:
                cnt *= 2
        elif int(time[0]) <= 1:
            if time[1] == "?":
                cnt *= 10
        else:
            if time[1] == "?":
                cnt *= 4
        
        if time[3] == "?":
            cnt *= 6
        if time[4] == "?":
            cnt *= 10
        return cnt

Explain

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

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def countTime(self, time: str) -> int:
        cnt = 1  # 初始化可行时间计数为 1
        # 检查小时的第一个字符
        if time[0] == '?':
            # 检查小时的第二个字符
            if time[1] == '?':
                cnt *= 24  # 如果两个小时数字都是 '?',则有 24 种可能的小时数
            elif int(time[1]) <= 3:
                cnt *= 3  # 如果第二个小时数字小于等于3,第一个小时数字可以是 0, 1, 2
            else:
                cnt *= 2  # 如果第二个小时数字大于3,第一个小时数字只能是 0 或 1
        elif int(time[0]) <= 1:
            if time[1] == '?':
                cnt *= 10  # 如果第一个小时数字是 0 或 1,第二个小时数字可以是 0 到 9
        else:
            if time[1] == '?':
                cnt *= 4  # 如果第一个小时数字是 2,第二个小时数字可以是 0 到 3
        # 检查分钟的第一个和第二个字符
        if time[3] == '?':
            cnt *= 6  # 分钟的第一个数字可以是 0 到 5
        if time[4] == '?':
            cnt *= 10  # 分钟的第二个数字可以是 0 到 9
        return cnt  # 返回总的可能时间数

Explore

在24小时制中,小时数的范围是从00到23,总共有24个有效的小时数。当小时的第一位和第二位都是 '?' 时,这意味着这两位可以任意组合来表示任何从00到23的数,因此总共有24种可能的组合方式。

这是基于24小时制中小时的最大值为23的规则。如果小时的第二位数字小于等于3,那么第一位可以安全地取0, 1, 或2,因为如20, 21, 22, 23都是有效的小时数。但是,如果第二位数字是4或更大,第一位不能取2,因为24, 25等不是有效的小时数。因此,第一位只能取0或1,如04, 14等是有效的。

分钟的表示必须在00到59之间。分钟的第一个数字取0到5的范围是因为分钟的十位最高不能超过5,例如59是有效的,而60是无效的。这个范围与分钟的第二位数字无关,因为无论第二位数字是什么,第一位数字都应该限制在0到5之间。

在24小时制中,当小时的第一位为2时,有效的小时数只能是20到23。如果第二位数字是4到9,如24, 25, 29等,这些都不是有效的小时数。因此,当第一位数字是2时,第二位数字只能从0到3中选择,以确保时间的有效性。