在LintCode上,针对“下一个最近的时间”问题,可以使用Java通过**枚举所有可能的时间组合**或**逐步递增时间并验证数字有效性**的方法来实现。以下是两种方法的详细说明和代码示例:

### 方法一:枚举所有可能的时间组合

1. **提取数字**:从给定的时间字符串中提取出所有可用的数字,并存储在一个集合中以便去重。
2. **生成所有可能的时间组合**:使用这些数字生成所有可能的小时和分钟组合。由于小时和分钟都是两位数,因此可以通过四重循环来生成所有可能的组合。
3. **验证时间有效性**:对于每一个生成的小时和分钟组合,验证其是否有效(小时小于24,分钟小于60)。
4. **计算时间差**:计算每一个有效时间与给定时间之间的分钟差,并找到最小的正差值。
5. **返回结果**:根据最小正差值找到对应的时间,并返回。

以下是该方法的Java代码示例:

```java
import java.util.HashSet;
import java.util.Set;

public class Solution {
    public String nextClosestTime(String time) {
        Set<Integer> digits = new HashSet<>();
        digits.add(time.charAt(0) - '0');
        digits.add(time.charAt(1) - '0');
        digits.add(time.charAt(3) - '0');
        digits.add(time.charAt(4) - '0');

        int currentMinutes = Integer.parseInt(time.substring(0, 2)) * 60 + Integer.parseInt(time.substring(3, 5));
        int minDiff = 24 * 60; // 一天中的最大分钟数
        String result = time;

        for (int h1 : digits) {
            for (int h2 : digits) {
                int hour = h1 * 10 + h2;
                if (hour < 24) {
                    for (int m1 : digits) {
                        for (int m2 : digits) {
                            int minute = m1 * 10 + m2;
                            if (minute < 60) {
                                int totalMinutes = hour * 60 + minute;
                                int diff = totalMinutes - currentMinutes;
                                if (diff < 0) {
                                    diff += 24 * 60; // 处理跨天的情况
                                }
                                if (diff > 0 && diff < minDiff) {
                                    minDiff = diff;
                                    result = String.format("%02d:%02d", hour, minute);
                                }
                            }
                        }
                    }
                }
            }
        }

        return result;
    }
}
```

### 方法二:逐步递增时间并验证数字有效性

1. **解析当前时间**:将给定的时间字符串解析为小时和分钟。
2. **逐步递增时间**:从当前时间开始,逐步递增一分钟,直到找到一个新的时间,其所有数字都在给定时间的数字集合中。
3. **处理跨天情况**:如果递增到24小时后仍未找到有效时间,则说明需要跨天,此时应返回由给定时间数字组成的最小时间。
4. **返回结果**:找到有效时间后,返回其字符串表示。

以下是该方法的Java代码示例:

```java
import java.util.HashSet;
import java.util.Set;

public class Solution {
    public String nextClosestTime(String time) {
        Set<Character> digits = new HashSet<>();
        digits.add(time.charAt(0));
        digits.add(time.charAt(1));
        digits.add(time.charAt(3));
        digits.add(time.charAt(4));

        int hour = Integer.parseInt(time.substring(0, 2));
        int minute = Integer.parseInt(time.substring(3, 5));

        while (true) {
            minute++;
            if (minute == 60) {
                minute = 0;
                hour++;
                if (hour == 24) {
                    hour = 0;
                }
            }

            String nextTime = String.format("%02d:%02d", hour, minute);
            boolean valid = true;
            for (char c : nextTime.toCharArray()) {
                if (!digits.contains(c)) {
                    valid = false;
                    break;
                }
            }

            if (valid) {
                return nextTime;
            }
        }
    }
}
```
 

 

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐