解密犯罪时间 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 HH:MM 表示的时刻。

根据警察和线人的约定,为了隐蔽,该事件是修改过的,解密规则为:

利用当前出现过的数字,构造下一个距离当前事件最近的时刻,则该时间为可能的犯罪的时间。每个数字都可以被无限次使用。

输入描述

形如 HH:SS 字符串,表示原始输入。

输出描述

HH:SS 字符串,表示推理处理的犯罪时间。

备注:

  1. 可以保证现任给定的字符串一定是合法的,例如,“01:3501:35” 和 “11:0811:08” 是合法的,“1:351:35"和"11:811:8” 是不合法的。
  2. 最近的时刻可能在第二天。

示例1

输入:
20:12输出:
20:20

示例2

输入:
23:59输出:
22:22

题解

这个问题可以分为以下几个步骤来解决:

  1. 记录已经出现的数字: 遍历输入的时间字符串,记录出现过的数字。这里可以使用一个长度为10的布尔数组exists,用于标记数字0到9是否出现过。
  2. 计算原始时间: 将输入的时间字符串转换为分钟表示,方便后续的计算。
  3. 枚举所有时间: 使用两层循环枚举所有可能的小时和分钟,然后计算对应的分钟数,得到当前时间点。
  4. 判断当前时间点是否符合条件: 判断当前小时和分钟的每一位数字是否都在已经出现过的数字中。如果有任何一个数字未出现,说明这个时间点不符合条件,直接跳过。
  5. 计算时间间隔: 计算当前时间点与原始时间的时间间隔,考虑了第二天的情况。
  6. 找到最近的时刻: 通过比较时间间隔找到最近的时刻,更新最近时刻的小时、分钟和时间间隔。
  7. 格式化输出结果: 最终输出找到的最近时刻。

Java

import java.util.Scanner;
/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String stime = scanner.next();int pos = stime.indexOf(":");// 记录已经出现的数字boolean[] exists = new boolean[10];for (char c : stime.toCharArray()) {if (Character.isDigit(c)) {exists[c - '0'] = true;}}// 小时,分钟,最近的时间间隔(分钟)int hour = 0, minute = 0, d = Integer.MAX_VALUE;// 原始时间int times = Integer.parseInt(stime.substring(0, pos)) * 60 + Integer.parseInt(stime.substring(pos + 1));// 枚举所有时间,找到下一个距离当前事件最近的时刻// - 如果时间点中有字符未出现,则不考虑该时间点,因为该时间点已经不可能是答案了// - 如果时间点中有字符出现://          - 如果时间相同,则不考虑该时间点,因为该时间点已经不可能是答案了//          - 如果时间不同,则考虑该时间点,因为该时间点可能是答案了,但是要判断当天还是下一天for (int h = 0; h < 24; h++) {if (!exists[h % 10] || !exists[h / 10]) continue;for (int m = 0; m < 60; m++) {int curTimes = h * 60 + m;// 字符未出现或时间相同if (!exists[m % 10] || !exists[m / 10] || curTimes == times) continue;// 计算时间间隔int curD = (curTimes > times) ? curTimes - times : 24 * 60 - (times - curTimes);if (curD < d) {   // 找到更近的时刻hour = h;minute = m;d = curD;}}}System.out.printf("%02d:%02d%n", hour, minute);}
}

Python

def find_nearest_time(stime):# 初始化存在性数组exists = [False] * 10# 找到时间中的冒号位置pos = stime.find(":")# 遍历时间字符串,标记存在的数字for c in stime:if c.isdigit():exists[int(c)] = True# 初始化小时、分钟和最小时间间隔hour, minute, d = 0, 0, float('inf')# 计算原始时间times = int(stime[:pos]) * 60 + int(stime[pos + 1:])# 枚举所有时间,找到下一个距离当前事件最近的时刻for h in range(24):if not exists[h % 10] or not exists[h // 10]:continuefor m in range(60):cur_times = h * 60 + m# 如果分钟或小时的某一位不存在,或者时间相同,则跳过if not exists[m % 10] or not exists[m // 10] or cur_times == times:continue# 计算时间间隔cur_d = cur_times - times if cur_times > times else 24 * 60 - (times - cur_times)# 找到更近的时刻if cur_d < d:hour, minute, d = h, m, cur_d# 格式化输出结果result = "{:02d}:{:02d}".format(hour, minute)print(result)# 从标准输入读取时间字符串
stime = input().strip()# 调用函数找到最近的时间
find_nearest_time(stime)

C++

#include <bits/stdc++.h>using namespace std;int main() {string stime;cin >> stime;int pos = stime.find(":");bool exists[10];for (char c : stime) {if (isdigit(c)) exists[c - '0'] = true;}// 小时,分钟,最近的时间间隔(分钟)int hour = 0, minute = 0, d = INT_MAX;// 原始时间int times = stoi(stime.substr(0, pos)) * 60 + stoi(stime.substr(pos + 1));// 枚举所有时间,找到下一个距离当前事件最近的时刻// - 如果时间点中有字符未出现,则不考虑该时间点,因为该时间点已经不可能是答案了// - 如果时间点中有字符出现://          - 如果时间相同,则不考虑该时间点,因为该时间点已经不可能是答案了//          - 如果时间不同,则考虑该时间点,因为该时间点可能是答案了,但是要判断当天还是下一天for (int h = 0; h < 24; h++) {if (!exists[h % 10] || !exists[h / 10]) continue;for (int m = 0; m < 60; m++) {int cur_times = h * 60 + m;// 字符未出现或时间相同if (!exists[m % 10] || !exists[m / 10] || cur_times == times) continue;// 计算时间间隔int cur_d = (cur_times > times) ? cur_times - times : 24 * 60 - (times + cur_times);if (cur_d < d) {   // 找到更近的时刻hour   = h;minute = m;d      = cur_d;}}}cout << (hour < 10 ? "0" : "") << hour << ":" << (minute < 10 ? "0" : "") << minute << endl;return 0;
}    

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/499515.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中几种常见的创建线程的方式

创建线程的几种方式 方法解释Thread()创建线程对象Thread(String name)创建线程对象&#xff0c;并给线程命名&#xff0c;不会影响线程Thread(Runnable runnable)使用Runnable对象创建线程Thread(Runnable runnable, String name)使用Runnable对象创建线程并给线程命名 方式…

AI论文速读 | 立场观点:时间序列分析,大模型能告诉我们什么?

题目&#xff1a;Position Paper: What Can Large Language Models Tell Us about Time Series Analysis 作者&#xff1a;Ming Jin ; Yifan Zhang ; Wei Chen ; Kexin Zhang ; Yuxuan Liang ; Bin Yang ; Jindong Wang ; Shirui Pan ; Qingsong Wen 机构&#xff1a;莫纳什大…

【C++】STL容器之string(修改操作)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

MYSQL学习笔记:索引

MYSQL学习笔记&#xff1a;索引 文章目录 MYSQL学习笔记&#xff1a;索引索引的分类索引的创建删除索引优化B树索引B树InnoDB主键和二级索引树聚集索引与非聚集索引哈希索引INNODB的自适应哈希索引索引和慢查询 用索引也是要涉及磁盘I/O的操作的索引也是一种数据结构&#xff0…

连续小波变换

1 连续小波变换 连续小波变换(CWT)用于分解小波信号。小波是时间上小的、高度局部的振荡。傅里叶变换将信号分解为无限长的正弦和余弦&#xff0c;从而丢失了所有时间位置信息&#xff0c;而CWT 的基本功能是时间局部化父小波的缩放和移位版本。CWT 用于构建信号的时频表示&am…

LeetCode225. 用队列实现栈(C++)

LeetCode225. 用队列实现栈 题目链接代码 题目链接 https://leetcode.cn/problems/implement-stack-using-queues/description/ 代码 class MyStack { public:queue<int> q1;queue<int> q2;MyStack() {}void push(int x) {q1.push(x);}int pop() {int size q1…

45、WEB攻防——通用漏洞PHP反序列化POP链构造魔术方法原生类

文章目录 序列化&#xff1a;将java、php等代码中的对象转化为数组或字符串等格式。代表函数serialize()&#xff0c;将一个对象转换成一个字符&#xff1b;反序列化&#xff1a;将数组或字符串等格式还成对象。代表函数unserialize()&#xff0c;将字符串还原成一个对象。 P…

配置前端项目到 github-pages

Quickstart for GitHub Pages - GitHub Docs

MySQL:合并查询语句

1、查询表的数据 t_book表数据 SELECT * FROM db_book.t_book; t_booktype表数据 SELECT * FROM db_book.t_booktype; 提醒&#xff1a; 下面的查询操作的数据来自上图查询表的数据 2. 使用 UNION 查询结果合并&#xff0c;会去掉重复的数据 使用UNION关键字是&#xff0c;数…

刷题日记 | 字符串扩容和增强型for循环

for(char c:s)遍历字符串 增强型for循环 C for(char c:s)遍历字符串 增强型for循环_c for (char c : s)-CSDN博客 字符串使用前要进行扩容 reserve函数 【CString类成员函数辨析】resize(),size(),capacity(),reserve()函数的解析与对比_c reserve函数-CSDN博客 a.size() 用来…

kali安装ARL灯塔(docker)

1、root身份进入容器 ┌──(root㉿Kali)-[~/桌面] └─# su root ┌──(root㉿Kali)-[~/桌面] └─# docker 2、先更新再克隆 ┌──(root㉿Kali)-[~/桌面] └─# apt-get update …

论文笔记:基于互信息估计和最大化的深度表示学习

整理了ICLR2019 LEARNING DEEP REPRESENTATIONS BY MUTUAL INFORMATION ESTIMATION AND MAXIMIZATION&#xff09;论文的阅读笔记 背景模型 论文地址&#xff1a;DIM code&#xff1a;代码地址 背景 发现有用的表示是深度学习的一个核心目标&#xff0c;由于之前的工作已经可以…