题目描述:
运维工程师采集到某产品线网运行一天产生的日志n条,现需根据日志时间先后顺序对日志进行排序,日志时间格式为H:M:S.N。
H表示小时(0~23)
M表示分钟(0~59)
S表示秒(0~59)
N表示毫秒(0~999)
时间可能并没有补全,也就是说,01:01:01.001也可能表示为1:1:1.1。
输入描述:
第一行输入一个整数n表示日志条数,1<=n<=100000,接下来n行输入n个时间。
输出描述:
按时间升序排序之后的时间,如果有两个时间表示的时间相同,则保持输入顺序。
示例:
1.输入:
2
01:41:8.9
1:1:09.211
输出:
1:1:09.211
01:41:8.9
2.输入:
3
23:41:08.023
1:1:09.211
08:01:22.0
输出:
1:1:09.211
08:01:22.0
23:41:08.023
3.输入:
2
22:41:08.023
22:41:08.23
输出:
22:41:08.023
22:41:08.23
思路:将输入的时间缺的0补上,然后使用map存储原日期和格式化后的日期,再对其进行排序
代码:
#include<bits/stdc++.h>
using namespace std;
string s[100000 + 5];
bool cmp(const pair<string, string> a, pair<string, string>b) {
return a.second < b.second;
}
int main() {
map<string, string>m;
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i];
string xs = s[i];
s[i] += '.';
int time = 0;
string ss;
string sum;
for (int j = 0; j < s[i].size(); j++) {
if (s[i][j] != ':' && s[i][j] != '.') {
ss += s[i][j];
continue;
}
if (time == 0) {
for (int x = 0; x < 2 - ss.length(); x++) {
sum += "0";
}
sum += ss + ":";
}
if (time == 1) {
for (int x = 0; x < 2 - ss.length(); x++) {
sum += "0";
}
sum += ss + ":";
}
if (time == 2) {
for (int x = 0; x < 2 - ss.length(); x++) {
sum += "0";
}
sum += ss + ":";
}
if (time == 3) {
for (int x = 0; x < 3 - ss.length(); x++) {
sum += "0";
}
sum += ss;
}
time++;
ss.clear();
}
m[xs] = sum;
}
vector<pair<string, string>>v(m.begin(), m.end());
sort(v.begin(), v.end(), cmp);
map<string, string>::iterator it;
for (int i = 0; i < v.size(); i++) {
cout << v[i].first << endl;
}
return 0;
}