//https://l...content-available-to-author-only...e.com/problems/next-closest-time/
/* LC 681 Medium - Next Closest Time - Google Interview Question
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.
**/
import java.util.HashSet;
import java.util.Set;
class NextClosestTime {
int minutes
= Integer.
parseInt(time.
substring(0,
2)) * 60 + Integer.
parseInt(time.
substring(3)); Set<Integer> digits = new HashSet<>();
for (char c : time.toCharArray())
if (c != ':')
while (true) {
minutes = (minutes + 1) % (24 * 60);
int[] nextTime = {
minutes / 60 / 10,
minutes / 60 % 10,
minutes % 60 / 10,
minutes % 60 % 10
};
boolean valid = true;
for (int digit : nextTime)
if (!digits.contains(digit))
valid = false;
if (valid)
return String.
format("%02d:%02d", minutes
/ 60, minutes
% 60); }
}
public static void main
(String[] args
) { NextClosestTime ob = new NextClosestTime();
System.
out.
println(ob.
nextClosestTime("19:34")); System.
out.
println(ob.
nextClosestTime("23:59")); }
}
Ly9odHRwczovL2wuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL3Byb2JsZW1zL25leHQtY2xvc2VzdC10aW1lLwoKLyogTEMgNjgxIE1lZGl1bSAtIE5leHQgQ2xvc2VzdCBUaW1lIC0gR29vZ2xlIEludGVydmlldyBRdWVzdGlvbgpHaXZlbiBhIHRpbWUgcmVwcmVzZW50ZWQgaW4gdGhlIGZvcm1hdCAiSEg6TU0iLCBmb3JtIHRoZSBuZXh0IGNsb3Nlc3QgdGltZSBieSByZXVzaW5nIHRoZSBjdXJyZW50IGRpZ2l0cy4KVGhlcmUgaXMgbm8gbGltaXQgb24gaG93IG1hbnkgdGltZXMgYSBkaWdpdCBjYW4gYmUgcmV1c2VkLgoKWW91IG1heSBhc3N1bWUgdGhlIGdpdmVuIGlucHV0IHN0cmluZyBpcyBhbHdheXMgdmFsaWQuCkZvciBleGFtcGxlLCAiMDE6MzQiLCAiMTI6MDkiIGFyZSBhbGwgdmFsaWQuICIxOjM0IiwgIjEyOjkiIGFyZSBhbGwgaW52YWxpZC4KRXhhbXBsZSAxOgoKSW5wdXQ6ICIxOTozNCIKT3V0cHV0OiAiMTk6MzkiCkV4cGxhbmF0aW9uOiBUaGUgbmV4dCBjbG9zZXN0IHRpbWUgY2hvb3NpbmcgZnJvbSBkaWdpdHMgMSwgOSwgMywgNCwgaXMgMTk6MzksIHdoaWNoIG9jY3VycyA1IG1pbnV0ZXMgbGF0ZXIuCkl0IGlzIG5vdCAxOTozMywgYmVjYXVzZSB0aGlzIG9jY3VycyAyMyBob3VycyBhbmQgNTkgbWludXRlcyBsYXRlci4KKiovCgppbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CmltcG9ydCBqYXZhLnV0aWwuU2V0OwoKY2xhc3MgTmV4dENsb3Nlc3RUaW1lIHsKICAgIHB1YmxpYyBTdHJpbmcgbmV4dENsb3Nlc3RUaW1lKFN0cmluZyB0aW1lKSB7CiAgICAgICAgaW50IG1pbnV0ZXMgPSBJbnRlZ2VyLnBhcnNlSW50KHRpbWUuc3Vic3RyaW5nKDAsIDIpKSAqIDYwICsgSW50ZWdlci5wYXJzZUludCh0aW1lLnN1YnN0cmluZygzKSk7CiAgICAgICAgU2V0PEludGVnZXI+IGRpZ2l0cyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICBmb3IgKGNoYXIgYyA6IHRpbWUudG9DaGFyQXJyYXkoKSkKICAgICAgICAgICAgaWYgKGMgIT0gJzonKQogICAgICAgICAgICAgICAgZGlnaXRzLmFkZChDaGFyYWN0ZXIuZGlnaXQoYywgMTApKTsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBtaW51dGVzID0gKG1pbnV0ZXMgKyAxKSAlICgyNCAqIDYwKTsKICAgICAgICAgICAgaW50W10gbmV4dFRpbWUgPSB7CiAgICAgICAgICAgICAgICAgICAgbWludXRlcyAvIDYwIC8gMTAsCiAgICAgICAgICAgICAgICAgICAgbWludXRlcyAvIDYwICUgMTAsCiAgICAgICAgICAgICAgICAgICAgbWludXRlcyAlIDYwIC8gMTAsCiAgICAgICAgICAgICAgICAgICAgbWludXRlcyAlIDYwICUgMTAKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7CiAgICAgICAgICAgIGZvciAoaW50IGRpZ2l0IDogbmV4dFRpbWUpCiAgICAgICAgICAgICAgICBpZiAoIWRpZ2l0cy5jb250YWlucyhkaWdpdCkpCiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHZhbGlkKQogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUwMmQ6JTAyZCIsIG1pbnV0ZXMgLyA2MCwgbWludXRlcyAlIDYwKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIE5leHRDbG9zZXN0VGltZSBvYiA9IG5ldyBOZXh0Q2xvc2VzdFRpbWUoKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ob2IubmV4dENsb3Nlc3RUaW1lKCIxOTozNCIpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ob2IubmV4dENsb3Nlc3RUaW1lKCIyMzo1OSIpKTsKICAgIH0KfQ==