内卷之源:
暂无
题目描述:
* 线人提供加密的时间,警官需要解密。
* 实际时间在输入时间之后的最近的时间点。
* 一个数字可重复用多次,但不能无中生有。
*
* 备注:(1)输入由用例保证,不会出现类似1:35和01:5之类的输入
* (2)时间可能在第二天
测试用例:
Input | Output |
01:35 | 01:50 |
23:59 | 22:22 |
22:59 | 22:22 |
23:45 | 23:52 |
19:34 | 19:39 |
18:52 | 18:55 |
20:12 | 20:20 |
06:58 | 08:00 |
思路分析:
真实时间在输入时间之后,数字可重复用多次,因此将组成时间的四个数字拆开,两两组合,最多16种,然后从中选出大于输入的时间组合即可。但要注意:H∈[00,23],M∈[00,59]
编程实现(C++):
/*
************************************************************
* @author SLF
* @version V1.0.0
* @date 05-Jul-2021
************************************************************
*/
#include <iostream>
#include <iomanip>
#include <array>
#include <algorithm> //sort
using namespace::std;
int main(void)
{
int H, M; //小时、分钟
int split[4] = {0};
// array<int, 16> H_M_gen_stl = {0};
int H_M_gen[16] = {0}; //将24小时制的四个数字重新组成两位数
int H_M_gen_num = 0;
scanf("%d:%d", &H, &M);
split[0] = H/10;
split[1] = H%10;
split[2] = M/10;
split[3] = M%10;
//generate
for(int i = 0, j = 0, t = 0; 4 > i; ++i)
{
if(5 < (t = split[i])) //分钟显示不超过59
{
continue;
}
for(j = 0; 4 > j; ++j)
{
H_M_gen[H_M_gen_num] = 10*t + split[j];
// H_M_gen_stl[H_M_gen_num] = 10*t + split[j];
++H_M_gen_num;
}
}
// sort(H_M_gen_stl.begin(), H_M_gen_stl.begin() + H_M_gen_num);
//select sort
int inx_min = 0;
bool exchg = false;
for(int i = 0, j = 0, t = H_M_gen_num - 1; t > i; ++i)
{
inx_min = j = i;
while(H_M_gen_num > (++j))
{
if(H_M_gen[inx_min] > H_M_gen[j])
{
inx_min = j;
exchg = true;
}
}
if(exchg)
{
exchg = false;
swap(H_M_gen[inx_min], H_M_gen[i]);
}
}
//decrypt crime time
if((23 == H) && (H_M_gen[H_M_gen_num -1] == M))
{//若H是23时,且M是最大分钟数,则次日最早时间
cout << setfill('0') << setw(2) << H_M_gen[0] << ":" << setw(2) << H_M_gen[0] << endl; //排序后第一个数绝对小于23
// printf("%02d:%02d\n", H_M_gen[0], H_M_gen[0]);
return 0;
}
for(int i = 0; H_M_gen_num > i; ++i)
{//基于H,判断M
if(M < H_M_gen[i])
{
cout << setfill('0') << setw(2) << H << ":" << setw(2) << H_M_gen[i] << endl;
return 0;
}
}//相同H,M最大
//下一个最小时间组合
for(int i = 0, t = H_M_gen_num - 1; H_M_gen_num > i; ++i)
{
if((24 > H_M_gen[i]) && (H < H_M_gen[i]))
{
cout << setfill('0') << setw(2) << H_M_gen[i] << ":" << setw(2) << H_M_gen[0] << endl;
return 0;
}
if(t == i) //次日
{
cout << setfill('0') << setw(2) << H_M_gen[0] << ":" << setw(2) << H_M_gen[0] << endl;
return 0;
}
}
return 0;
}
郑重提示:①解题思路非最优,覆盖条件可能不全,仅供练习参考。
②若有更佳思路或疑问,可在评论区留言相互讨论,不亦乐乎。
③本文不允许转载,若认可本文,可点赞收藏关注。