数据结构和算法:警察根据线人提供的加密时间破案

内卷之源:

暂无

题目描述:

 * 线人提供加密的时间,警官需要解密。
 * 实际时间在输入时间之后的最近的时间点。
 * 一个数字可重复用多次,但不能无中生有。
 * 
 * 备注:(1)输入由用例保证,不会出现类似1:35和01:5之类的输入
 *              (2)时间可能在第二天

测试用例:

InputOutput
01:3501:50
23:5922:22
22:5922:22
23:4523:52
19:3419:39
18:5218:55
20:1220:20
06:5808: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;
}

  

郑重提示:​​​​​​​①解题思路非最优,覆盖条件可能不全,仅供练习参考。

                  ②若有更佳思路或疑问,可在评论区留言相互讨论,不亦乐乎。

                  ③本文不允许转载,若认可本文,可点赞收藏关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值