替换隐藏数字得到的最晚时间

标签: 贪心 字符串

难度: Easy

给你一个字符串 time ,格式为 hh:mm(小时:分钟),其中某几位数字被隐藏(用 ? 表示)。

有效的时间为 00:0023:59 之间的所有时间,包括 00:0023:59

替换 time 中隐藏的数字,返回你可以得到的最晚有效时间。

 

示例 1:

输入:time = "2?:?0"
输出:"23:50"
解释:以数字 '2' 开头的最晚一小时是 23 ,以 '0' 结尾的最晚一分钟是 50 。

示例 2:

输入:time = "0?:3?"
输出:"09:39"

示例 3:

输入:time = "1?:22"
输出:"19:22"

 

提示:

  • time 的格式为 hh:mm
  • 题目数据保证你可以由输入的字符串生成有效的时间

Submission

运行时间: 24 ms

内存: 0.0 MB

class Solution:
    def maximumTime(self, time: str) -> str:
        ans=""
        if time[0]=="?":
            if time[1]=="?":
                ans="23"
            else:
                if int(time[1])>3:
                    ans="1"+time[1]
                else:
                    ans="2"+time[1]
        elif time[1]=="?":
            if int(time[0])==2:
                ans=time[0]+"3"
            else:
                ans=time[0]+"9"
        else:
            ans=time[0]+time[1]
        
        ans+=":"
        if time[3]=="?":
            ans+="5"
        else:
            ans+=time[3]
        
        if time[4]=="?":
            ans+="9"
        else:
            ans+=time[4]
        
        return ans

Explain

此题解通过直接检查输入字符串time中的每一位来构造可能的最晚时间。首先处理小时部分(前两位),然后处理分钟部分(后两位)。对于小时部分,首先检查第一位是否为'?',如果是,则根据第二位的值来决定第一位应该是'1'还是'2'。如果第二位也是'?',则直接设为'23'(因为这是可能的最大小时)。如果第二位不是'?',则根据其值是否大于3来决定第一位数字。对于分钟部分,如果第三或第四位是'?',则分别替换为可能的最大值'5'和'9'来得到最晚的时间。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def maximumTime(self, time: str) -> str:
        ans = ""
        # 处理小时的第一位
        if time[0] == '?':
            if time[1] == '?':
                ans = "23"  # 如果两位都是'?'
            else:
                if int(time[1]) > 3:
                    ans = "1" + time[1]  # 第二位大于3,第一位只能是1
                else:
                    ans = "2" + time[1]  # 第二位不大于3,第一位可以设为2
        elif time[1] == '?':
            if int(time[0]) == 2:
                ans = time[0] + "3"  # 第一位是2,第二位最大只能是3
            else:
                ans = time[0] + "9"  # 第一位是0或1,第二位可以是9
        else:
            ans = time[0] + time[1]  # 如果两位都不是'?', 直接使用
        
        ans += ":"
        # 处理分钟的第一位
        if time[3] == '?':
            ans += "5"  # 分钟的第一位,最大为5
        else:
            ans += time[3]
        
        # 处理分钟的第二位
        if time[4] == '?':
            ans += "9"  # 分钟的第二位,最大为9
        else:
            ans += time[4]
        
        return ans

Explore

在24小时制的时间表示中,小时数的最大值是23。因此,如果时间的第一位是'2',那么第二位最多只能是'3',以确保时间属于有效范围。如果将第二位设为'9',则会形成'29'小时,这是不合理的。因此,为了保证时间的合法性,当第一位为'2'时,第二位必须在0到3之间,最大设为'3'。

当小时部分的第一位和第二位都是'?'时,设置为'23'确实能覆盖最大小时数的情况,因为'23'是一天中可能的最晚小时数。这样的设定简化了逻辑,并直接提供了可能的最晚时间。因此,这种处理方法不仅有效,而且直接使得输出时间尽可能晚,符合题目的要求。