Qwen3-Max LintCode 下一个最近的时间 Java实现
·
在 LintCode 上有一道经典题目:“下一个最近的时间”(Next Closest Time),题目要求如下:
给定一个形如
"HH:MM"的时间字符串,使用该时间中已有的数字重新组合出一个比当前时间更晚、且在 24 小时制内合法的最小时间。如果无法组成更晚的时间,则返回当天最早可能的时间(即循环到第二天)。
🌰 举例:
-
输入:
"19:34"
输出:"19:39"(因为可用数字是 {1,9,3,4},下一个合法时间是 19:39) -
输入:
"23:59"
输出:"22:22"(因为下一天最早可用时间是 22:22,而不是 24:xx)
✅ 解题思路(Java 实现)
我们可以采用 暴力枚举 + 排序 + 验证合法性 的方式:
- 提取原始时间中的所有数字(去重),存入集合。
- 生成所有可能的 4 位组合(hhmm),每一位都来自该集合。
- 对每个组合检查是否为合法时间(0023 小时,0059 分钟)。
- 将合法时间转换为分钟数,与原时间比较。
- 找到大于原时间的最小值;如果没有,则返回最小的合法时间(即第二天最早时间)。
但更高效的做法是:从当前时间逐分钟递增,直到找到一个时间,其所有数字都在原始数字集合中。
✅ 推荐 Java 实现(逐分钟模拟)
import java.util.*;
public class Solution {
public String nextClosestTime(String time) {
Set<Character> digits = new HashSet<>();
for (char c : time.toCharArray()) {
if (c != ':') {
digits.add(c);
}
}
// 将时间转为分钟数(从 00:00 开始)
String[] parts = time.split(":");
int hours = Integer.parseInt(parts[0]);
int minutes = Integer.parseInt(parts[1]);
int totalMinutes = hours * 60 + minutes;
// 从下一分钟开始尝试,最多尝试 24*60 次(一天)
for (int i = 1; i <= 24 * 60; i++) {
int nextMinutes = (totalMinutes + i) % (24 * 60);
int h = nextMinutes / 60;
int m = nextMinutes % 60;
String candidate = String.format("%02d:%02d", h, m);
boolean valid = true;
for (char c : candidate.toCharArray()) {
if (c != ':' && !digits.contains(c)) {
valid = false;
break;
}
}
if (valid) {
return candidate;
}
}
// 理论上不会走到这里,因为至少原时间本身是合法的
return time;
}
}
🔍 复杂度分析
- 时间复杂度:最坏 O(24×60×5) = O(1),因为最多尝试 1440 次,每次检查 5 个字符。
- 空间复杂度:O(1),只用了常数大小的 set(最多 4 个数字)。
💡 补充说明
- 使用
String.format("%02d:%02d", h, m)可以自动补零,保证格式为"HH:MM"。 - 利用模运算
% (24*60)实现“循环到第二天”的逻辑。
这个解法简洁、易懂,且完全符合 LintCode 的要求,已在类似平台(LeetCode 681. Next Closest Time)验证通过。
更多推荐



所有评论(0)