题解
题目难度:中等难度
知识点:字符串、数字、字典序
解释:字典序是指从前到后比较两个字符串的大小的方法。首先比较第一个字符,如果不同则第一个字符较小的字符串更小,如果相同则继续比较第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; }