2024华为OD机试真题目录-(B卷C卷D卷)-【C++ Java Python】
题目描述
警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。
根据警察和线人的约定,为了隐蔽,该时间是修改过的,
解密规则为:
利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。每个出现数字都可以被无限次使用。
输入描述
形如HH:SS字符串,表示原始输入。
输出描述
形如HH:SS的字符串,表示推理处理的犯罪时间。
备注
1.可以保证现任给定的字符串一定是合法的。
例如,“01:35”和“11:08”是合法的,“1:35”和“11:8”是不合法的。
2.最近的时刻可能在第二天。
用例1
输入
20:12
输出
20:20
用例2
输入
23:59
输出
22:22
用例3
输入
12:58
输出
15:11
用例4
输入
18:52
输出
18:55
用例5
输入
23:52
输出
23:53
用例6
输入
09:17
输出
09:19
用例7
输入
07:08
输出
08:00
考点
全排列
题目解析
解密规则为:利用当前出现过的数字,构造下一个距离当前时间最近的时刻,则该时间为可能的犯罪时间。本题重在理解“下一个”最近时间,因此要求的时间在当前时间之后,但也可能是第二天的时间。也就是说,要求的时间并不是严格比当前时间小的。
这题其实用dfs求全排列的话,就很简单。要满足时间格式,将所有时间升序排列后,取当前时间的下一个时间。
代码
c++
#include <bits/stdc++.h>
using namespace std;
vector<string> res; // 存全部时间的排列
void dfs(string str, int ind, string tmp) {
if(tmp.size()==4) {
int h=stoi(tmp.substr(0,2));
int m=stoi(tmp.substr(2,2));
if((h<=23) && m<=59) {
res.push_back(tmp);
}
return ;
}
for(int i=ind;i<str.size();i++) {
tmp+=str[i];
dfs(str,ind,tmp);
tmp=tmp.substr(0,tmp.size()-1);
}
}
int main() {
string