题解

题目难度:中等难度

知识点:字符串、数字、字典序

解释:字典序是指从前到后比较两个字符串的大小的方法。首先比较第一个字符,如果不同则第一个字符较小的字符串更小,如果相同则继续比较第2个字符......如此继续,来比较整个字符串的大小。

方法(一)

只要判断时分秒位是否大于23、59、59,如果大的话,就把高位置重置为0即可。将输入的字符串拆分为三部分,与最大值进行比较。高位置0,只需要将数学除以10取其余数即可,如79重置为79%10=09。

#include <iostream>
#include <string>
using namespace std;
int main(){
    int N;
    cin>>N;
    while(N>0){
        string str; 
        cin>>str;
        if(str.substr(0,2)>"23") str[0]='0';
        if(str.substr(3,2)>"59") str[3]='0';
        if(str.substr(6,2)>"59") str[6]='0';
        cout<<str<<endl;
        N--;
    }
    return 0;
}

方法(二)

将数据读入后,按位进行转换。
第1位0-2
第2位0-9【注】当第1位是0或1时,第二位可以取0-9任意;当第一位时2时,第二位只能取0-3。
第3位0-5
第4位0-9
第5位0-5
第6位0-9
当第1位取2,第2位>3时,可以是第1位不变,第2位置置0;也可以第1位置0,第2位不变。显然第2种方法字典序更小,除了这种情况,其他按位的范围取就可以。

#include<iostream>
using namespace std;
int main(){
    int N;
    cin>>N;
    while(N){
        int H1,H2,M1,M2,S1,S2;
        string str;
        cin>>str;
        H1 = str[0]-'0';
        H2 = str[1]-'0';
        M1 = str[3]-'0';
        M2 = str[4]-'0';
        S1 = str[6]-'0';
        S2 = str[7]-'0';
        if(H1>=3 ) H1=0;
        else if(H1==2 &&H2>3) H1=0;
        if(M1>5) M1=0;
        if(S1>5) S1=0;
        cout<<H1<<H2<<":"<<M1<<M2<<":"<<S1<<S2<<endl;
        N--;
    }
    return 0;
}