华为OD统一考试 - 解密犯罪时间

题目描述

警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “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

题目解析

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

本题重在理解“下一个”最近时间,这里是“下一个”,而不是“上一个”,因此要求的时间在当前时间之后。但是备注中又说:“最近的时刻可能在第二天。”

也就是说,要求的时间  并不是严格 比当前时间 小的。

这题其实用dfs求全排列的话,就很简单。

我们基于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',
 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024华为OD机试卷题 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD 题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客企业服务