华为OD机试统一考试D卷C卷 - 解密犯罪时间
题目描述
警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。
根据警察和线人的约定,为了隐蔽,该时间是修改过的,
解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。
每个出现数字都可以被无限次使用。
输入描述
形如HH:SS字符串,表示原始输入。
输出描述
形如HH:SS的字符串,表示推理处理的犯罪时间。
备注
1.可以保证现任给定的字符串一定是合法的。
例如,“01:35”和“11:08”是合法的,“1:35”和“11:8”是不合法的。
2.最近的时刻可能在第二天。
用例
输入 | 输出 |
20:12 | 20:20 |
23:59 | 22:22 |
12:58 | 15:11 |
18:52 | 18:55 |
23:52 | 23:53 |
09:17 | 09:19 |
07:08 | 08:00 |
java
# 代码1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 创建Scanner对象用于读取输入
Scanner scanner = new Scanner(System.in);
// 读取一行输入作为原始时间
String input = scanner.next();
// 打印出经过处理的下一个可能的犯罪时间
System.out.println(findNextTime(input));
}
public static String findNextTime(String time) {
// 解析字符串时间为小时和分钟
int hours = Integer.parseInt(time.substring(0, 2));
int minutes = Integer.parseInt(time.substring(3, 5));
// 创建一个布尔数组,用于标记哪些数字是可用的
boolean[] available = new boolean[10];
// 遍历时间字符串中的每个字符,如果不是':',则标记对应的数字为可用
for (char c : time.toCharArray()) {
if (c != ':') {
available[c - '0'] = true;
}
}
// 初始化下一个可能的小时和分钟数为当前时间
int nextHours = hours;
int nextMinutes = minutes;
// 循环直到找到一个符合条件的时间
do {
nextMinutes++; // 尝试下一个分钟数
if (nextMinutes == 60) { // 如果分钟数达到60,归零并小时数加一
nextMinutes = 0;
nextHours++;
nextHours %= 24; // 小时数达到24时归零
}
} while (!isValid(nextHours, nextMinutes, available)); // 检查当前尝试的时间是否有效
// 返回格式化后的时间字符串
return String.format("%02d:%02d", nextHours, nextMinutes);
}
private static boolean isValid(int hours, int minutes, boolean[] available) {
// 将小时和分钟数分解为单独的数字
int[] digits = {hours / 10, hours % 10, minutes / 10, minutes % 10};
// 遍历每个
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
机试E卷D卷刷题日记 文章被收录于专栏
机试刷题记录