leetcode_681. 最近时刻

294 阅读2分钟

要求

给定一个形如 “HH:MM” 表示的时刻,利用当前出现过的数字构造下一个距离当前时间最近的时刻。每个出现数字都可以被无限次使用。

你可以认为给定的字符串一定是合法的。例如,“01:34” 和 “12:09” 是合法的,“1:34” 和 “12:9” 是不合法的。

样例 1:

输入: "19:34"
输出: "19:39"
解释: 利用数字 1, 9, 3, 4 构造出来的最近时刻是 19:39,是 5 分钟之后。结果不是 19:33 因为这个时刻是 23 小时 59 分钟之后。

样例 2:

输入: "23:59"
输出: "22:22"
解释: 利用数字 2, 3, 5, 9 构造出来的最近时刻是 22:22。 答案一定是第二天的某一时刻,所以选择可构造的最小时刻。

核心代码

class Solution:
    def nextClosestTime(self, time: str) -> str:
        hour1,minute1 = time.split(":")
        numbers = set(hour1 + minute1)
        hour2 = hour1
        minute2 = minute1

        # 寻找更大的分钟
        for i in range(int(minute1) + 1,60):
            minute = str(i).zfill(2)
            if minute[0] in numbers and minute[1] in numbers:
                return hour2 + ":" + minute
        
        # 寻找更大的小时
        for i in range(int(hour1) + 1,24):
            temp = str(i).zfill(2)
            if temp[0] in numbers and temp[1] in numbers:
                hour2 = temp
                break
            
        # 寻找更小的分钟
        for i in range(0,60):
            temp = str(i).zfill(2)
            if temp[0] in numbers and temp[1] in numbers:
                minute2 = temp
                break
        if hour1 != hour2:
            return hour2 + ":" + minute2
        
        # 寻找下一天时间中的最小的小时
        for i in range(0,23):
            hour2 = str(i).zfill(2)
            if hour2[0] in numbers and hour2[1] in numbers:
                return hour2 + ":" + minute2
        # 无法改变
        return hour1 + ":" + minute1

image.png

解题思路:这道题我们需要考虑3种情况,分别是第一种情况:我们从分钟中进行递增,直到有满足条件的出现就是最接近的时间,第二种情况:小时的递增,小时递增了之后,我们还要看一下,时间0~60之间是不是有满足条件的,因为假设12:39 最近的时间是13:12,第三种情况,就是递增小时和分钟都解决不了的,我们想的就是寻找下一天中最小时刻,综上,得出最终的结果。