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.----------------------------------
把所有的时间组合都找出来,去掉不合法的,然后排序。
另一个方法是模拟始终,一步步往前走
class Solution { public String nextClosestTime(String time) { Set<Character> set = new HashSet<>(); for (int i = 0; i < time.length(); i++) { char c = time.charAt(i); if (c != ':') set.add(c); } Set<String> rt = new HashSet<>(); rt.add(""); for (int i = 0; i < 4; i++) { Set<String> tmp = new HashSet<>(); for (String s : rt) { for (Character c : set) { String ca = s + c; if (i == 3) { if (isValid(ca)) tmp.add(s + c); }else { tmp.add(s + c); } } } rt = tmp; } List<String> fi = new ArrayList<String>(rt); Collections.sort(fi); String con = time.substring(0, 2) + time.substring(3); for (int i = 0; i < fi.size(); i++) { if (fi.get(i).equals(con) && i < fi.size() - 1) { return fi.get(i + 1).substring(0, 2) + ":" + fi.get(i + 1).substring(2); } } return fi.get(0).substring(0, 2) + ":" + fi.get(0).substring(2); } private boolean isValid(String s) { String firstHalf = s.substring(0,2); String secondHalf = s.substring(2); if (firstHalf.compareTo("23") > 0 || secondHalf.compareTo("59") > 0) return false; return true; } }
No comments:
Post a Comment