最新华为OD机试真题-破译犯罪时间(100分)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员
✨ 本系列打算持续跟新 华为OD机试-D卷 的三语言AC题解
👏 感谢大家的订阅➕ 和 喜欢💗
📎在线评测链接
🌍 评测功能需要 =>订阅专栏<= 后联系清隆解锁~
🍓OJ题目截图
🪬 破译犯罪时间
题目描述
LYA 是一名优秀的警察,最近她正在调查一起案件。在调查过程中,线人给了她一个可能的犯罪时间,但是为了保密,线人对时间进行了加密。加密方式如下:利用犯罪时间出现过的数字,构造一个距离犯罪时间最近的新时间,则该新时间为真正的犯罪时间。在构造新时间时,可以无限次使用犯罪时间出现过的数字。
输入格式
输入一个字符串,代表加密后的犯罪时间,格式为 ,保证输入合法。
输出格式
输出一个字符串,代表破译出的真正的犯罪时间,格式为 。
样例输入1
20:12
样例输出1
20:20
样例输入2
23:59
样例输出2
22:22
数据范围
-
可以保证现任给定的字符串一定是合法的。例如,“01:35”和“11:08”是合法的,“1:35”和“11:8”是不合法的。
-
破译出的犯罪时间可能在第二天。
题解
可以枚举所有可能的小时和分钟,判断构造出的新时间是否合法且是否比当前的最近时间更接近原始的犯罪时间。
注意在计算时间差值时,如果新时间晚于原始犯罪时间,则直接计算差值即可;如果新时间早于原始犯罪时间,则需要加上一天的分钟数 。
最后将最近时间转换为 的格式输出即可。
参考代码
- Python
s = input()
vis = [False] * 10
for c in s:
if '0' <= c <= '9':
vis[int(c)] = True
hour, minute = int(s[:2]), int(s[3:])
time = hour * 60 + minute
d = float('inf')
for h in range(24):
if vis[h // 10] and vis[h % 10]:
for m in range(60):
if vis[m // 10] and vis[m % 10]:
t = h * 60 + m
if t == time:
continue
td = t - time if t > time else 24 * 60 - (time - t)
if td < d:
hour, minute, d = h, m, td
print(f"{hour:02d}:{minute:02d}")
- Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
boolean[] vis = new boolean[10];
for (char c : s.toCharArray()) {
if (c >= '0' && c <= '9') {
vis[c - '0'] = true;
}
}
int hour = Integer.parseInt(s.substring(0, 2));
int minute = Integer.parseInt(s.substring(3));
int time = hour * 60 + minute;
int d = Integer.MAX_VALUE;
for (int h = 0; h < 24; h++) {
if (vis[h / 10] && vis[h % 10]) {
for (int m = 0; m < 60; m++) {
if (vis[m / 10] && vis[m % 10]) {
int t = h * 60 + m;
if (t == time) {
continue;
}
int td = t > time ? t - time : 24 * 60 - (time - t);
if (td < d) {
hour = h;
minute = m;
d = td;
}
}
}
}
}
System.out.printf("%02d:%02d\n", hour, minute);
}
}
- Cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
bool vis[10] = {false};
for (char c : s) {
if (c >= '0' && c <= '9') {
vis[c - '0'] = true;
}
}
int hour = stoi(s.substr(0, 2));
int minute = stoi(s.substr(3));
int time = hour * 60 + minute;
int d = INT_MAX;
for (int h = 0; h < 24; h++) {
if (vis[h / 10] && vis[h % 10]) {
for (int m = 0; m < 60; m++) {
if (vis[m / 10] && vis[m % 10]) {
int t = h * 60 + m;
if (t == time) {
continue;
}
int td = t > time ? t - time : 24 * 60 - (time - t);
if (td < d) {
hour = h;
minute = m;
d = td;
}
}
}
}
}
printf("%02d:%02d\n", hour, minute);
return 0;
}
#华为OD##华为##笔试##秋招##华为OD题库#最新华为OD机试-D卷 文章被收录于专栏
本专栏给大家提供了华为2024最新华为OD-C/D卷的题目汇总和(Java/Cpp/Python)三语言解析 + 提供OJ在线评测