输入描述:
每个输入数据包含多个测试点。每个测试点后有一个空行。 第一行为测试点的个数T(T<=100)。 每个测试点包含1行,为一个字符串”HH:MM:SS”,表示钟表显示的时间。
输出描述:
对于每个测试点,输出一行。如果钟表显示的时间为真实存在的时间,则不做改动输出该时间,否则输出一个新的”HH:MM:SS”,表示修改最少的数字情况下,字典序最小的真实存在的时间。
输入例子1:
2 19:90:23 23:59:59
输出例子1:
19:00:23 23:59:59
自己出错的原因:
1、当时没有看懂 输出描述里面要求的 每一个测试点都要有一个输出;这样才是正确的 我一开始写成了一个字符串数组;最后一起输出的;所有在这里面出错了 ;总结出自己的弱点 因为长期刷leetcode 对输入输出的描述这一方面比较缺乏;所以还是待于加强;
思路:
- 写一个函数判断输入的字符串是否为一个合格的时间;如果不合格的话 转化为合格的至于怎么转化,需要直接把时、分、秒的第一位直接赋值为‘0’就是了;
- 其中需要比较字符串 所以需要写一个字符串的比较函数
- 另外需要写一个字符转化为字符串的函数 这个是自己不会的;需要把字符转化为一个字符串数组表示出来 然后在直接赋值给一个string类对象
CODE:
//第一题:
#include<iostream>
#include <vector>
#include <assert.h>
#include<ctime>
#include<cmath>
#include<string>
using namespace std;
string charToString(char c)
{
string s;
char s1[2] = { c, 0 };
s = s1;
//cout << "字符转化为字符串是:";
//cout << s << endl;
return s;
}
bool cmp(string &s1, string s2)
{
return stoi(s1) > stoi(s2);
}
string printstring(string &s)
{
int len = s.size();
//assert(len>=9);
string s1 = s.substr(0, 2);
string s2 = s.substr(3, 2);
string s3 = s.substr(6, 2);
s1 = cmp(s1,"23") ? ("0" + charToString(s1[1])) : s1;
//cout << "此时的是:"<<s1<<endl;
s2 = cmp(s2, "59") ? ("0" + charToString(s2[1])) : s2;
//cout << "此时的是:" << s2 << endl;
s3 = cmp(s3, "59") ? ("0" + charToString(s3[1])) : s3;
//cout << "此时的是:" << s3 << endl;
string res = s1 + ":" + s2 + ":" + s3;
return res;
}
//=========main函数
int main()
{
int T;
cin >> T;
assert(T <= 100);
while (T--)
{
string s;
cin >> s;
string res = printstring(s);
cout << res << endl;
}
}