【华为OD】解锁犯罪时间

题目描述

警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如"HH:MM"表示的时刻。根据警察和线人的约定,为了隐蔽,该时间是修改过的,解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。每个出现数字都可以被无限次使用。

输入描述

形如 HH:MM 的字符串,表示原始输入

输出描述

形如 HH:MM 的字符串,表示推理出来的犯罪时间

补充说明

  1. 可以保证线人给定的字符串一定是合法的。例如,"01:35"和"11:08"是合法的,"1:35"和"11:8"是不合法的
  2. 最近的时刻有可能在第二天

示例

输入: 18:52
输出: 18:55

解题思路

这道题的核心是要找到比给定时间大的最小时间,且新时间只能使用原时间中出现过的数字。

我们可以采用两种不同的解法:

解法一:暴力枚举法

思路分析

从给定时间开始,每次增加1分钟,检查新时间是否只使用了原时间中的数字。这种方法简单直观,但在最坏情况下可能需要遍历较多时间。

Java实现

import java.util.*;public class Solution1 {public static String findNextTime(String time) {// 提取原时间中的所有数字Set<Character> availableDigits = new HashSet<>();for (char c : time.toCharArray()) {if (c != ':') {availableDigits.add(c);}}// 解析当前时间String[] parts = time.split(":");int hour = Integer.parseInt(parts[0]);int minute = Integer.parseInt(parts[1]);// 从下一分钟开始寻找minute++;while (true) {// 处理时间进位if (minute >= 60) {minute = 0;hour++;if (hour >= 24) {hour = 0;}}// 格式化时间字符串String newTime = String.format("%02d:%02d", hour, minute);// 检查新时间是否只使用了可用数字if (isValidTime(newTime, availableDigits)) {return newTime;}minute++;}}// 检查时间字符串是否只使用了可用数字private static boolean isValidTime(String time, Set<Character> availableDigits) {for (char c : time.toCharArray()) {if (c != ':' && !availableDigits.contains(c)) {return false;}}return true;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();System.out.println(findNextTime(input));scanner.close();}
}

Python实现

def find_next_time(time):# 提取原时间中的所有数字available_digits = set(c for c in time if c != ':')# 解析当前时间hour, minute = map(int, time.split(':'))# 从下一分钟开始寻找minute += 1while True:# 处理时间进位if minute >= 60:minute = 0hour += 1if hour >= 24:hour = 0# 格式化时间字符串new_time = f"{hour:02d}:{minute:02d}"# 检查新时间是否只使用了可用数字if is_valid_time(new_time, available_digits):return new_timeminute += 1def is_valid_time(time, available_digits):"""检查时间字符串是否只使用了可用数字"""return all(c == ':' or c in available_digits for c in time)# 主程序
if __name__ == "__main__":input_time = input().strip()print(find_next_time(input_time))

C++实现

#include <iostream>
#include <string>
#include <set>
#include <iomanip>
#include <sstream>
using namespace std;class Solution1 {
public:// 检查时间字符串是否只使用了可用数字bool isValidTime(const string& time, const set<char>& availableDigits) {for (char c : time) {if (c != ':' && availableDigits.find(c) == availableDigits.end()) {return false;}}return true;}string findNextTime(const string& time) {// 提取原时间中的所有数字set<char> availableDigits;for (char c : time) {if (c != ':') {availableDigits.insert(c);}}// 解析当前时间int hour = stoi(time.substr(0, 2));int minute = stoi(time.substr(3, 2));// 从下一分钟开始寻找minute++;while (true) {// 处理时间进位if (minute >= 60) {minute = 0;hour++;if (hour >= 24) {hour = 0;}}// 格式化时间字符串stringstream ss;ss << setfill('0') << setw(2) << hour << ":" << setfill('0') << setw(2) << minute;string newTime = ss.str();// 检查新时间是否只使用了可用数字if (isValidTime(newTime, availableDigits)) {return newTime;}minute++;}}
};int main() {string input;cin >> input;Solution1 solution;cout << solution.findNextTime(input) << endl;return 0;
}

解法二:智能构造法

思路分析

这种方法更加高效,通过分析时间的结构,智能地构造下一个有效时间:

  1. 首先尝试增加分钟的个位数
  2. 如果不行,尝试增加分钟的十位数,个位数用最小可用数字
  3. 如果还不行,尝试增加小时,分钟用最小可用数字组合
  4. 最后考虑跨天的情况

Java实现

import java.util.*;public class Solution2 {public static String findNextTime(String time) {// 提取并排序可用数字List<Character> digits = new ArrayList<>();for (char c : time.toCharArray()) {if (c != ':') {digits.add(c);}}Collections.sort(digits);// 解析当前时间String[] parts = time.split(":");int hour = Integer.parseInt(parts[0]);int minute = Integer.parseInt(parts[1]);// 尝试构造下一个有效时间String result = tryConstructNext(hour, minute, digits);return result;}private static String tryConstructNext(int hour, int minute, List<Character> digits) {// 1. 尝试增加分钟个位String result = tryIncrementMinuteUnit(hour, minute, digits);if (result != null) return result;// 2. 尝试增加分钟十位result = tryIncrementMinuteTen(hour, minute, digits);if (result != null) return result;// 3. 尝试增加小时result = tryIncrementHour(hour, digits);if (result != null) return result;// 4. 跨天处理return constructEarliestTime(digits);}// 尝试增加分钟个位数private static String tryIncrementMinuteUnit(int hour, int minute, List<Character> digits) {int minuteUnit = minute % 10;int minuteTen = minute / 10;for (char d : digits) {int newUnit = d - '0';if (newUnit > minuteUnit && minuteTen * 10 + newUnit < 60) {return String.format("%02d:%d%d", hour, minuteTen, newUnit);}}return null;}// 尝试增加分钟十位数private static String tryIncrementMinuteTen(int hour, int minute, List<Character> digits) {int minuteTen = minute / 10;for (char d : digits) {int newTen = d - '0';if (newTen > minuteTen && newTen < 6) {int minUnit = digits.get(0) - '0';return String.format("%02d:%d%d", hour, newTen, minUnit);}}return null;}// 尝试增加小时private static String tryIncrementHour(int hour, List<Character> digits) {// 尝试增加小时个位int hourUnit = hour % 10;int hourTen = hour / 10;for (char d : digits) {int newUnit = d - '0';if (newUnit > hourUnit && hourTen * 10 + newUnit < 24) {return String.format("%d%d:%s", hourTen, newUnit, getMinMinute(digits));}}// 尝试增加小时十位for (char d : digits) {int newTen = d - '0';if (newTen > hourTen && newTen < 3) {int minUnit = digits.get(0) - '0';if (newTen * 10 + minUnit < 24) {return String.format("%d%d:%s", newTen, minUnit, getMinMinute(digits));}}}return null;}// 构造最早的有效时间(用于跨天)private static String constructEarliestTime(List<Character> digits) {return String.format("%s:%s", getMinHour(digits), getMinMinute(digits));}// 获取最小有效小时private static String getMinHour(List<Character> digits) {char min = digits.get(0);for (char d : digits) {if (d <= '2') {return String.format("%c%c", d, min);}}return String.format("%c%c", min, min);}// 获取最小有效分钟private static String getMinMinute(List<Character> digits) {char min = digits.get(0);for (char d : digits) {if (d <= '5') {return String.format("%c%c", d, min);}}return String.format("%c%c", min, min);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();System.out.println(findNextTime(input));scanner.close();}
}

Python实现

def find_next_time(time):# 提取并排序可用数字digits = sorted([c for c in time if c != ':'])# 解析当前时间hour, minute = map(int, time.split(':'))# 尝试构造下一个有效时间return try_construct_next(hour, minute, digits)def try_construct_next(hour, minute, digits):# 1. 尝试增加分钟个位result = try_increment_minute_unit(hour, minute, digits)if result:return result# 2. 尝试增加分钟十位result = try_increment_minute_ten(hour, minute, digits)if result:return result# 3. 尝试增加小时result = try_increment_hour(hour, digits)if result:return result# 4. 跨天处理return construct_earliest_time(digits)def try_increment_minute_unit(hour, minute, digits):"""尝试增加分钟个位数"""minute_unit = minute % 10minute_ten = minute // 10for d in digits:new_unit = int(d)if new_unit > minute_unit and minute_ten * 10 + new_unit < 60:return f"{hour:02d}:{minute_ten}{new_unit}"return Nonedef try_increment_minute_ten(hour, minute, digits):"""尝试增加分钟十位数"""minute_ten = minute // 10for d in digits:new_ten = int(d)if new_ten > minute_ten and new_ten < 6:min_unit = int(digits[0])return f"{hour:02d}:{new_ten}{min_unit}"return Nonedef try_increment_hour(hour, digits):"""尝试增加小时"""# 尝试增加小时个位hour_unit = hour % 10hour_ten = hour // 10for d in digits:new_unit = int(d)if new_unit > hour_unit and hour_ten * 10 + new_unit < 24:return f"{hour_ten}{new_unit}:{get_min_minute(digits)}"# 尝试增加小时十位for d in digits:new_ten = int(d)if new_ten > hour_ten and new_ten < 3:min_unit = int(digits[0])if new_ten * 10 + min_unit < 24:return f"{new_ten}{min_unit}:{get_min_minute(digits)}"return Nonedef construct_earliest_time(digits):"""构造最早的有效时间(用于跨天)"""return f"{get_min_hour(digits)}:{get_min_minute(digits)}"def get_min_hour(digits):"""获取最小有效小时"""min_digit = digits[0]for d in digits:if int(d) <= 2:return f"{d}{min_digit}"return f"{min_digit}{min_digit}"def get_min_minute(digits):"""获取最小有效分钟"""min_digit = digits[0]for d in digits:if int(d) <= 5:return f"{d}{min_digit}"return f"{min_digit}{min_digit}"# 主程序
if __name__ == "__main__":input_time = input().strip()print(find_next_time(input_time))

C++实现

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <sstream>
using namespace std;class Solution2 {
private:// 获取最小有效分钟string getMinMinute(const vector<char>& digits) {char minDigit = digits[0];for (char d : digits) {if (d <= '5') {return string(1, d) + string(1, minDigit);}}return string(1, minDigit) + string(1, minDigit);}// 获取最小有效小时string getMinHour(const vector<char>& digits) {char minDigit = digits[0];for (char d : digits) {if (d <= '2') {return string(1, d) + string(1, minDigit);}}return string(1, minDigit) + string(1, minDigit);}// 构造最早的有效时间string constructEarliestTime(const vector<char>& digits) {return getMinHour(digits) + ":" + getMinMinute(digits);}// 尝试增加分钟个位数string tryIncrementMinuteUnit(int hour, int minute, const vector<char>& digits) {int minuteUnit = minute % 10;int minuteTen = minute / 10;for (char d : digits) {int newUnit = d - '0';if (newUnit > minuteUnit && minuteTen * 10 + newUnit < 60) {stringstream ss;ss << setfill('0') << setw(2) << hour << ":" << minuteTen << newUnit;return ss.str();}}return "";}// 尝试增加分钟十位数string tryIncrementMinuteTen(int hour, int minute, const vector<char>& digits) {int minuteTen = minute / 10;for (char d : digits) {int newTen = d - '0';if (newTen > minuteTen && newTen < 6) {int minUnit = digits[0] - '0';stringstream ss;ss << setfill('0') << setw(2) << hour << ":" << newTen << minUnit;return ss.str();}}return "";}// 尝试增加小时string tryIncrementHour(int hour, const vector<char>& digits) {// 尝试增加小时个位int hourUnit = hour % 10;int hourTen = hour / 10;for (char d : digits) {int newUnit = d - '0';if (newUnit > hourUnit && hourTen * 10 + newUnit < 24) {return to_string(hourTen) + string(1, d) + ":" + getMinMinute(digits);}}// 尝试增加小时十位for (char d : digits) {int newTen = d - '0';if (newTen > hourTen && newTen < 3) {int minUnit = digits[0] - '0';if (newTen * 10 + minUnit < 24) {return string(1, d) + to_string(minUnit) + ":" + getMinMinute(digits);}}}return "";}// 尝试构造下一个有效时间string tryConstructNext(int hour, int minute, const vector<char>& digits) {// 1. 尝试增加分钟个位string result = tryIncrementMinuteUnit(hour, minute, digits);if (!result.empty()) return result;// 2. 尝试增加分钟十位result = tryIncrementMinuteTen(hour, minute, digits);if (!result.empty()) return result;// 3. 尝试增加小时result = tryIncrementHour(hour, digits);if (!result.empty()) return result;// 4. 跨天处理return constructEarliestTime(digits);}public:string findNextTime(const string& time) {// 提取并排序可用数字vector<char> digits;for (char c : time) {if (c != ':') {digits.push_back(c);}}sort(digits.begin(), digits.end());// 解析当前时间int hour = stoi(time.substr(0, 2));int minute = stoi(time.substr(3, 2));// 尝试构造下一个有效时间return tryConstructNext(hour, minute, digits);}
};int main() {string input;cin >> input;Solution2 solution;cout << solution.findNextTime(input) << endl;return 0;
}

总结

两种解法各有优劣:

暴力枚举法

  • 优点:逻辑简单,易于理解和实现
  • 缺点:在最坏情况下可能需要遍历很多时间点,效率较低

智能构造法

  • 优点:效率高,直接构造目标时间,时间复杂度更优
  • 缺点:实现复杂,需要考虑多种情况

对于这道题,由于时间范围有限(24小时),两种方法都能很好地解决问题。在实际应用中,可以根据具体需求选择合适的解法。

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

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

相关文章

基于linux操作系统的mysql安装

一、检查自己的操作系统是否已经有存在的mysql 1.存在 2.不存在 二、基于操作系统不存在mysql,找官方yum源 网址&#xff1a; Index of /232905https://repo.mysql.com/ 网站打开是这样 看看自己的操作系统是哪个版本&#xff0c;再下载哪个版本&#xff0c;如果和我一样装…

如何用 Git Hook 和 CI 流水线为 FastAPI 项目保驾护航?

url: /posts/fc4ef84559e04693a620d0714cb30787/ title: 如何用Git Hook和CI流水线为FastAPI项目保驾护航? date: 2025-09-14T00:12:42+08:00 lastmod: 2025-09-14T00:12:42+08:00 author: cmdragon summary: 持续集成(CI)在FastAPI项目中通过频繁合并代码和自动验证,确保…

【微服务】SpringBoot 整合Kafka 项目实战操作详解

目录 一、前言 二、Kafka 介绍 2.1 什么是 Apache Kafka 2.2 Kafka 核心概念与架构 2.3 Kafka 为什么如此强大 2.4 Kafka 在微服务领域的应用场景 三、Docker 部署Kakfa服务 3.1 环境准备 3.2 Docker部署Kafka操作过程 3.2.1 创建docker网络 3.2.2 启动zookeeper容器…

多楼层室内定位可视化 Demo(A*路径避障)

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>多楼层室内定位可视化 Demo&#xff08;A*避障&#xff09;</title> <style>body { margin: 0; overflow: hidden; }#layerControls { p…

vue2+jessibuca播放h265视频(能播h264)

文档地址&#xff1a;http://jessibuca.monibuca.com/api.html#background 1,文件放在public中 2,在html中引入 3&#xff0c;子组件 <template><div :id"container id"></div> </template><script> export default {props: [url,…

Docker命令大全:从基础到高级实战指南

Docker命令大全&#xff1a;从基础到高级实战指南 Docker作为现代容器化技术的核心工具&#xff0c;其命令体系是开发运维的必备技能。本文将系统整理常用命令&#xff0c;助您高效管理容器生态。一、基础命令篇 1. 镜像管理 # 拉取镜像 $ docker pull nginx:latest# 查看本地镜…

不邻排列:如何优雅地避开“数字CP“

排列组合奇妙冒险&#xff1a;如何优雅地避开"数字CP"&#xff1f; ——容斥原理教你破解连续数对排列难题 &#x1f4dc; 问题描述 题目&#xff1a;求1,2,3,4,5,6,7,81,2,3,4,5,6,7,81,2,3,4,5,6,7,8的排列个数&#xff0c;使得排列中不出现连续的12,23,34,45,56,6…

S7-200 SMART PLC 安全全指南:配置、漏洞解析与复现防护

在工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;作为核心控制单元&#xff0c;其安全性直接关系到生产系统的稳定运行与数据安全。西门子 S7-200 SMART 系列 PLC 凭借高性价比、易用性等优势&#xff0c;广泛应用于中小型自动化项目。但实际使用中&a…

【计算机网络 | 第14篇】应用层协议

文章目录 应用层协议的核心定义&#xff1a;“通信合同”的关键内容&#x1f95d;应用层协议的分类&#xff1a;公共标准 vs 专有协议&#x1f9fe;公共标准协议专有协议 应用层协议与网络应用的关系&#x1f914;案例1&#xff1a;Web应用案例2&#xff1a;Netflix视频服务 应…

小迪web自用笔记33

再次提到预编译&#xff0c;不会改变固定逻辑。id等于什么的只能更换页面。过滤器&#xff1a;代码一旦执行在页面中&#xff0c;就会执行&#xff0c;xss跨站。Js的特性是显示在页面中之后开始执行&#xff0c;那个代码是打印过后然后再渲染。是的&#xff0c;核心是**“打印&…

Zynq开发实践(FPGA之第一个vivado工程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】数字电路设计&#xff0c;如果仅仅是写写代码&#xff0c;做做verilog仿真&#xff0c;那么其实是不需要转移到fpga上面的。这就好比是算法工程师&a…

【Selenium】Selenium 测试失败排查:一次元素定位超时的完整解决之旅

Selenium 测试失败排查:一次元素定位超时的完整解决之旅 在自动化测试过程中,我们经常会遇到元素定位超时的问题。本文记录了一次完整的 Selenium TimeoutException 排查过程,从问题发现到最终解决,涵盖了各种常见陷阱和解决方案。 问题背景 测试用例在执行过程中失败,…

32.网络基础概念(二)

局域网网络传输流程图两台主机在同一个局域网&#xff0c;是否能够直接通信&#xff1f;以太网原理举例&#xff1a;上课&#xff0c;老师点名小王让他站起来回答问题。教室里的其他人是可以听见的&#xff0c;为什么其他人不响应&#xff1f;因为老师叫的是小王&#xff0c;和…

【高并发内存池】六、三种缓存的回收内存过程

文章目录前言Ⅰ. thread cache的内存回收Ⅱ. central cache的内存回收Ⅲ. page cache的内存回收前言 ​ 前面我们将内存的申请流程都走通了&#xff0c;现在就是内存回收的过程&#xff0c;主要是从 thread cache 开始&#xff0c;一层一层往下回收&#xff0c;因为我们调用的…

DeerFlow 实践:华为IPD流程的评审智能体设计

目录 一、项目背景与目标 二、IPD 流程关键评审点与 TR 点解析 &#xff08;一&#xff09;4 个关键评审点 &#xff08;二&#xff09;6 个 TR 点 三、评审智能体详细设计与协作机制 机制设计核心原则 &#xff08;一&#xff09;概念评审&#xff08;CDCP&#xff09;…

【ubuntu】ubuntu中找不到串口设备问题排查

ubuntu中找不到串口问题排查1. 检查设备识别情况2. 检查并安装驱动3. 检查内核消息4. 禁用brltty服务1. 停止并禁用 brltty 服务2. 完全移除 brltty 包3. 重启系统或重新插拔设备5.输出结果问题&#xff1a;虚拟机ubuntu中&#xff0c;已经显示串口设备连接成功&#xff0c;但是…

Unity 性能优化 之 静态资源优化 (音频 | 模型 | 纹理 | 动画)

Unity 之 性能优化 -- 静态资源优化参考性能指标静态资源资源工作流程资源分类原理小结Audio 实战优化建议模型导入工作流程DCC中模型导出.DCC中Mesh生产规范模型导出检查流程模型优化建议纹理优化纹理基础概念纹理类型纹理大小纹理颜色空间纹理压缩纹理图集纹理过滤纹理Mipmap…

GitHub 热榜项目 - 日榜(2025-09-13)

GitHub 热榜项目 - 日榜(2025-09-13) 生成于&#xff1a;2025-09-13 统计摘要 共发现热门项目&#xff1a;18 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜项目呈现三大技术热点&#xff1a;AI开发工具化&#xff08;如GenKit、ROMA多智能体框架&#xff…

Pytest 常见问题及其解决方案

常见问题及解决方案 1. 测试通过了,但覆盖率不达标 现象: 虽然所有测试都通过了,但覆盖率报告显示某些代码没有被覆盖。 解决方案: 检查覆盖率配置:确保 .coveragerc 或 pytest.ini 中正确设置了要分析的源代码路径。 使用标记(markers)排除测试文件本身:避免测试代…

直击3D内容创作痛点-火山引擎多媒体实验室首次主持SIGGRAPH Workshop,用前沿技术降低沉浸式内容生成门槛

当3D、VR技术在游戏、教育、医疗、文化领域遍地开花&#xff0c;“内容短缺”却成了制约行业爆发的关键瓶颈——传统3D/4D创作不仅耗时耗力、依赖专业技能&#xff0c;还难以适配消费级设备&#xff0c;让许多创作者望而却步。近日&#xff0c;由火山引擎多媒体实验室联合领域顶…