在 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 实现)

我们可以采用 暴力枚举 + 排序 + 验证合法性 的方式:

  1. 提取原始时间中的所有数字(去重),存入集合。
  2. 生成所有可能的 4 位组合(hhmm),每一位都来自该集合。
  3. 对每个组合检查是否为合法时间(0023 小时,0059 分钟)。
  4. 将合法时间转换为分钟数,与原时间比较。
  5. 找到大于原时间的最小值;如果没有,则返回最小的合法时间(即第二天最早时间)。

但更高效的做法是:从当前时间逐分钟递增,直到找到一个时间,其所有数字都在原始数字集合中


✅ 推荐 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)验证通过。

 

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐