zoukankan      html  css  js  c++  java
  • LeetCode 681. Next Closest Time

    原题链接在这里:https://leetcode.com/problems/next-closest-time/

    题目:

    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: "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: "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.

    题解:

    用当前time已经出现的四个数字,组成新的time. 找diff最小的新time.

    First get integer hash value of current time.

    Get all 4 digits of current time. Take 2 of them to construct hour, and the other 2 to construct minute.

    Use new time hash value - current time hash value and maintain the minimum diff.

    If minused result < 0, it is next day, add it with 24 * 60.

    Time Complexity: O(1). 共有4^4种组合.

    Space: O(1). size为4的HashSet.

    AC Java:

     1 class Solution {
     2     public String nextClosestTime(String time) {
     3         Set<Integer> hs = new HashSet<>();
     4         for(int i = 0; i<time.length(); i++){
     5             char c = time.charAt(i);
     6             if(c != ':'){
     7                 hs.add(c-'0');
     8             }
     9         }
    10         
    11         int cur = Integer.valueOf(time.substring(0, 2)) * 60 + Integer.valueOf(time.substring(3, 5)); 
    12         
    13         int minDiff = 24*60;
    14         // res is initialized as time, in case "11:11". The expected result is "11: 11".
    15         String res = time;
    16         for(int h1 : hs){
    17             for(int h2 : hs){
    18                 if(h1*10 + h2 < 24){
    19                     for(int m1 : hs){
    20                         for(int m2 : hs){
    21                             if(m1*10 + m2 < 60){
    22                                 int can = (h1*10+h2) * 60 + m1*10+m2;
    23                                 int diff = can-cur;
    24                                 if(diff < 0){
    25                                     diff += 24*60;
    26                                 }
    27                                 
    28                                 // diff can't 0, otherwise, it would return itself
    29                                 if(diff>0 && diff<minDiff){
    30                                     minDiff = diff;
    31                                     res = ""+h1+h2+":"+m1+m2;
    32                                     System.out.println("m1: "+ m1 + " m2: " + m2);
    33                                 }
    34                             }
    35                         }
    36                     }
    37                 }
    38             }
    39         }
    40         
    41         return res;
    42     }
    43 }
  • 相关阅读:
    SQL注入方法之:获取列名
    手把手教会你模拟退火算法
    我的G++编译选项
    编译器优化误解程序员的意思
    ZKW线段树
    扩展欧几里得算法
    快速幂
    乘法取模
    莫队算法良心讲解
    高精度模板
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/7707622.html
Copyright © 2011-2022 走看看