Easy

题目描述

给你一个长度为 5 的字符串 time,表示一个数字时钟上的当前时间,格式为 "hh:mm"。最早可能的时间是 "00:00",最晚可能的时间是 "23:59"

在字符串 time 中,由 ? 表示的数字是未知的,必须用 09 中的数字替换。

请你返回一个整数 answer,将每个 ? 都用 09 中的一个数字替换后,一共能得到多少个有效的时钟时间。

示例 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"
  • 一些数字可能被 ? 替换,需要用 09 的数字替换

解题思路

这道题需要统计将所有 ? 替换为数字后能形成多少个有效的时钟时间。

核心思路: 分别统计小时部分和分钟部分的可能选择数,然后相乘得到总数。

小时部分分析(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)

相关题目