Skip to content

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

Solution:

class Solution {
    public String nextClosestTime(String time) {
        // Extract the hour and minute from the input time string
        int hour = Integer.parseInt(time.substring(0, 2));
        int min = Integer.parseInt(time.substring(3, 5));

        // Begin an infinite loop to find the next closest time
        while (true) {
            // Increment the minute by one
            min++;

            // If the minute reaches 60, reset to 0 and increment the hour
            if (min == 60) {
                min = 0;            // Reset minutes to 0
                hour++;             // Increment hour by 1
                hour = hour % 24;   // Use modulo to ensure the hour wraps around after 23
            }

            // Format the current time (hour and minute) back into a string in the format "HH:MM"
            String curr = String.format("%02d:%02d", hour, min);

            // Initialize a boolean variable to check if the current time is valid
            Boolean valid = true;

            // Iterate through each character in the formatted time string
            for (int i = 0; i < curr.length(); i++) {
                // Check if the current character exists in the original time string
                if (time.indexOf(curr.charAt(i)) < 0) {
                    valid = false;  // If any character does not exist, mark as invalid and break the loop
                    break;
                }
            }

            // If the current time is valid (all characters exist in the original time string), return it
            if (valid) {
                return curr;
            }
        }
    }
}

Format String "%02d:%02d":

  • The format string "%02d:%02d" specifies how the output string should be structured.
  • %02d:
    • % is the format specifier symbol.
    • 0 is a flag that indicates that the number should be padded with zeros if it's not long enough (for example, if it's 7, it will be padded to 07).
    • 2 specifies the minimum width, meaning the number should be at least 2 digits long.
    • d stands for "decimal integer," meaning that the input will be an integer value.
  • : is a literal colon character that will appear between the hour and minute.
  • The second %02d: Works exactly the same as the first one, but it applies to the minute.

The indexOf() method in Java is used to find the index (position) of a specified character or substring within a string. If the character or substring is found, indexOf() returns the index of the first occurrence. If it is not found, it returns -1.