代码改变世界

[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]