comments | difficulty | edit_url | tags | ||||
---|---|---|---|---|---|---|---|
true |
中等 |
|
给定一个形如 "HH:MM"
表示的时刻 time
,利用当前出现过的数字构造下一个距离当前时间最近的时刻。每个出现数字都可以被无限次使用。
你可以认为给定的字符串一定是合法的。例如, "01:34"
和 "12:09"
是合法的,“1:34”
和 “12:9”
是不合法的。
示例 1:
输入: "19:34" 输出: "19:39" 解释: 利用数字 1, 9, 3, 4 构造出来的最近时刻是 19:39,是 5 分钟之后。 结果不是 19:33 因为这个时刻是 23 小时 59 分钟之后。
示例 2:
输入: "23:59" 输出: "22:22" 解释: 利用数字 2, 3, 5, 9 构造出来的最近时刻是 22:22。 答案一定是第二天的某一时刻,所以选择可构造的最小时刻。
提示:
time.length == 5
time
为有效时间,格式为"HH:MM"
.0 <= HH < 24
0 <= MM < 60
class Solution:
def nextClosestTime(self, time: str) -> str:
def check(t):
h, m = int(t[:2]), int(t[2:])
return 0 <= h < 24 and 0 <= m < 60
def dfs(curr):
if len(curr) == 4:
if not check(curr):
return
nonlocal ans, d
p = int(curr[:2]) * 60 + int(curr[2:])
if t < p < t + d:
d = p - t
ans = curr[:2] + ':' + curr[2:]
return
for c in s:
dfs(curr + c)
s = {c for c in time if c != ':'}
t = int(time[:2]) * 60 + int(time[3:])
d = inf
ans = None
dfs('')
if ans is None:
mi = min(int(c) for c in s)
ans = f'{mi}{mi}:{mi}{mi}'
return ans
class Solution {
private int t;
private int d;
private String ans;
private Set<Character> s;
public String nextClosestTime(String time) {
t = Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3));
d = Integer.MAX_VALUE;
s = new HashSet<>();
char mi = 'z';
for (char c : time.toCharArray()) {
if (c != ':') {
s.add(c);
if (c < mi) {
mi = c;
}
}
}
ans = null;
dfs("");
if (ans == null) {
ans = "" + mi + mi + ":" + mi + mi;
}
return ans;
}
private void dfs(String curr) {
if (curr.length() == 4) {
if (!check(curr)) {
return;
}
int p
= Integer.parseInt(curr.substring(0, 2)) * 60 + Integer.parseInt(curr.substring(2));
if (p > t && p - t < d) {
d = p - t;
ans = curr.substring(0, 2) + ":" + curr.substring(2);
}
return;
}
for (char c : s) {
dfs(curr + c);
}
}
private boolean check(String t) {
int h = Integer.parseInt(t.substring(0, 2));
int m = Integer.parseInt(t.substring(2));
return 0 <= h && h < 24 && 0 <= m && m < 60;
}
}