news 2026/5/8 5:10:31

(新卷,100分)- 解密犯罪时间(Java JS Python)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,100分)- 解密犯罪时间(Java JS Python)

(新卷,100分)- 解密犯罪时间(Java & JS & Python)

题目描述

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

根据警察和线人的约定,为了隐蔽,该时间是修改过的,

解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。

每个出现数字都可以被无限次使用。

输入描述

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

输出描述

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

备注

1.可以保证现任给定的字符串一定是合法的。

例如,“01:35”和“11:08”是合法的,“1:35”和“11:8”是不合法的。

2.最近的时刻可能在第二天。

用例
输入输出
20:1220:20
23:5922:22
12:5815:11
18:5218:55
23:5223:53
09:1709:19
07:0808:00
题目解析

解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。

本题关键在于理解“下一个”最近时间,这里指的是“下一个”而非“上一个”,即要求的时间必须在当前时间之后。不过需要注意,最近的时刻可能出现在第二天。

这道题采用DFS求全排列的方法会相对简单。具体实现时,我们可以基于输入"20:12"生成所有可能的排列组合。

由于题目说明"每个数字都可以被无限次使用",因此在生成排列时,每一层都可以重复使用相同的数字(0、1、2)。当然,生成的排列中会包含一些非法时间,我们可以通过正则表达式来过滤这些无效时间。

const regExp = /(([01][0-9])|([2][0-3]))[0-5][0-9]/;

剩余的全排列如下

[ '2222', '2220', '2221', '2202', '2200', '2201', '2212', '2210', '2211', '2022', '2020', '2021', '2002', '2000', '2001', '2012', '2010', '2011', '2122', '2120', '2121', '2102', '2100', '2101', '2112', '2110', '2111', '0222', '0220', '0221', '0202', '0200', '0201', '0212', '0210', '0211', '0022', '0020', '0021', '0002', '0000', '0001', '0012', '0010', '0011', '0122', '0120', '0121', '0102', '0100', '0101', '0112', '0110', '0111', '1222', '1220', '1221', '1202', '1200', '1201', '1212', '1210', '1211', '1022', '1020', '1021', '1002', '1000', '1001', '1012', '1010', '1011', '1122', '1120', '1121', '1102', '1100', '1101', '1112', '1110', '1111' ]

我们将其按字典序升序

[ '0000', '0001', '0002', '0010', '0011', '0012', '0020', '0021', '0022', '0100', '0101', '0102', '0110', '0111', '0112', '0120', '0121', '0122', '0200', '0201', '0202', '0210', '0211', '0212', '0220', '0221', '0222', '1000', '1001', '1002', '1010', '1011', '1012', '1020', '1021', '1022', '1100', '1101', '1102', '1110', '1111', '1112', '1120', '1121', '1122', '1200', '1201', '1202', '1210', '1211', '1212', '1220', '1221', '1222', '2000', '2001', '2002', '2010', '2011', '2012', '2020', '2021', '2022', '2100', '2101', '2102', '2110', '2111', '2112', '2120', '2121', '2122', '2200', '2201', '2202', '2210', '2211', '2212', '2220', '2221', '2222' ]

首先找到20:12对应的2012之后的时间2020,这就是我们需要的结果。只需在2020中间添加一个冒号":",即可得到最终答案。

若输入的时间字符串恰好是排序后全排列的最后一个元素,则需要取第二天的第一个时间,也就是排序后的第一个元素。

Java算法源码
import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.Scanner; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[] tmp = sc.nextLine().split(":"); String hour = tmp[0]; String minute = tmp[1]; System.out.println(getResult(hour, minute)); } public static String getResult(String hour, String minute) { HashSet<Character> set = new HashSet<>(); for (int i = 0; i < hour.length(); i++) set.add(hour.charAt(i)); for (int i = 0; i < minute.length(); i++) set.add(minute.charAt(i)); Character[] arr = set.toArray(new Character[0]); ArrayList<String> res = new ArrayList<>(); dfs(arr, new LinkedList<>(), res); res.sort(String::compareTo); int index = res.indexOf(hour + minute); String recentTime; if (index == res.size() - 1) { recentTime = res.get(0); } else { recentTime = res.get(index + 1); } String[] split = recentTime.split(""); split[1] += ":"; return String.join("", split); } static Pattern p = Pattern.compile("(([01][0-9])|([2][0-3]))[0-5][0-9]"); public static void dfs(Character[] arr, LinkedList<Character> path, ArrayList<String> res) { if (path.size() == 4) { StringBuilder sb = new StringBuilder(); for (Character c : path) sb.append(c); String timeStr = sb.toString(); if (p.matcher(timeStr).find()) { res.add(timeStr); } return; } for (Character c : arr) { path.add(c); dfs(arr, path, res); path.removeLast(); } } }
JS算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { const [hour, minute] = line.split(":"); console.log(getResult(hour, minute)); }); function getResult(hour, minute) { const arr = [...new Set([...hour, ...minute])]; const res = []; dfs(arr, [], res); res.sort(); let index = res.indexOf(`${hour}${minute}`); let recentTime; if (index === res.length - 1) { recentTime = [...res[0]]; } else { recentTime = [...res[index + 1]]; } recentTime.splice(2, 0, ":"); return recentTime.join(""); } function dfs(arr, path, res) { if (path.length === 4) { const timeStr = path.join(""); const regExp = /(([01][0-9])|([2][0-3]))[0-5][0-9]/; if (regExp.test(timeStr)) res.push(timeStr); return; } for (let i = 0; i < arr.length; i++) { path.push(arr[i]); dfs(arr, path, res); path.pop(); } }
Python算法源码
import re reg = re.compile("(([01][0-9])|([2][0-3]))[0-5][0-9]") # 输入获取 hour, minute = input().split(":") def dfs(arr, path, res): if len(path) == 4: timeStr = "".join(path) if reg.search(timeStr) is not None: res.append(timeStr) return for i in range(len(arr)): path.append(arr[i]) dfs(arr, path, res) path.pop() # 算法入口 def getResult(): arr = list(hour) arr.extend(list(minute)) arr = list(set(arr)) res = [] dfs(arr, [], res) res.sort() index = res.index(hour + minute) if index == len(res) - 1: recentTime = res[0] else: recentTime = res[index + 1] ans = list(recentTime) ans[1] += ":" return "".join(ans) # 调用算法 print(getResult())
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 5:10:30

Android 15 Binder驱动与内核机制深度解析

引言 如果你曾经好奇Android应用是如何跨进程调用系统服务的,或者为什么Binder被称为Android的"神经系统",那么这篇文章就是为你准备的。 作为Android系统最核心的IPC(进程间通信)机制,Binder不仅是应用与系统服务交互的桥梁,更是整个Android生态的基石。从应用启动…

作者头像 李华
网站建设 2026/5/1 10:23:27

SSM毕设选题推荐:基于ssm的电子商务平台的设计与实现基于Java+SSM的电子商务平台的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/3 7:12:02

数据科学赋能提示工程:架构师的创新实践

数据科学赋能提示工程&#xff1a;架构师的创新实践 引言 1. 当提示工程遇到“人工瓶颈”&#xff1a;架构师的真实痛点 作为一名AI架构师&#xff0c;你可能经历过这样的场景&#xff1a; 为了让LLM&#xff08;大语言模型&#xff09;准确回答用户问题&#xff0c;你反复…

作者头像 李华
网站建设 2026/4/30 5:38:34

Hadoop与人工智能:推动大数据智能化发展

Hadoop与人工智能&#xff1a;开启大数据智能化的奇幻之旅 关键词&#xff1a;Hadoop、人工智能、大数据、分布式存储、MapReduce、机器学习、数据处理 摘要&#xff1a;本文深入探讨Hadoop与人工智能如何携手推动大数据智能化发展。通过生动比喻和详细解析&#xff0c;先介绍H…

作者头像 李华
网站建设 2026/5/1 1:49:59

【干货收藏】AI Agent部署完全指南:四种形态选择与最佳实践

随着 AI Agent / Agentic AI 从 Demo 走向生产环境&#xff0c;一个绕不开的问题是&#xff1a;Agent 应该“部署”在哪里&#xff1f;很多人只关注模型能力&#xff0c;却忽略了 Agent 本质是一种软件系统。 它同样要面对调度、吞吐、延迟、成本、安全、扩展性等工程问题。 从…

作者头像 李华