[LeetCode] 681. Next Closest Time_Medium tag: array, sort
2021-08-10 10:46 Johnson_强生仔仔 阅读(32) 评论(0) 编辑 收藏 举报Given a time
represented in the format "HH:MM"
, form the next closest time by reusing the current digits. There is no limit on how many times a digit can be reused.
You may assume the given input string is always valid. For example, "01:34"
, "12:09"
are all valid. "1:34"
, "12:9"
are all invalid.
Example 1:
Input: time = "19:34" Output: "19:39" Explanation: The next closest time choosing from digits 1, 9, 3, 4, is 19:39, which occurs 5 minutes later. It is not 19:33, because this occurs 23 hours and 59 minutes later.
Example 2:
Input: time = "23:59" Output: "22:22" Explanation: The next closest time choosing from digits 2, 3, 5, 9, is 22:22. It may be assumed that the returned time is next day's time since it is smaller than the input time numerically.
Constraints:
time.length == 5
time
is a valid time in the form"HH:MM"
.0 <= HH < 24
0 <= MM < 60
Ideas: NOTE: '1' < '10' , string 里面也可以直接比较,牛逼了!
疑问or note:"11:11" => "11:11", 也就是说如果不能产生next closest, then return itself.
1. 先将4个digit放到set 里面然后排序
2. generate values: 因为之前digits已经sorted过了,所以这个是直接已经排好序的(at most 16 个,因为4 * 4)
3. 先看minute是否在values有下一位,如果有valid( < '60'),那么返回 hour : + 下一位minute
4. 如果minute不行,那么再看hour是否在values有下一位,如果有valid( < '24'), 那么返回 下一位hour + :+ values[0] : 注意这里minute换成最小的minute了
5. 最后返回values[0] + : + values[0]
Code:
class Solution: def nextClosestTime(self, time: str) -> str: hour, minute = time.split(':') nums = sorted(set(hour + minute)) values= [a + b for a in nums for b in nums] n = len(values) i = values.index(minute) if i + 1 < n and values[i + 1] < '60': return hour + ':' + values[i + 1] i = values.index(hour) if i + 1 < n and values[i + 1] < '24': return values[i + 1] + ':' + values[0] return values[0] + ':' + values[0]