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