【华为OD】运维日志排序

题目描述

运维工程师采集到某产品线网运行一天产生的日志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存储原日期和格式化后的日期,再对其进行排序

代码:

cpp 复制代码
#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;
}
相关推荐
我的知识太少了1 分钟前
P1122 最大子树和
算法
UrSpecial2 分钟前
Linux线程
linux·开发语言·c++
郝学胜-神的一滴2 分钟前
深入浅出 C++20:新特性与实践
开发语言·c++·程序人生·算法·c++20
汉克老师15 分钟前
第十四届蓝桥杯青少组C++选拔赛[2023.1.15]第二部分编程题(2 、寻宝石)
c++·蓝桥杯·蓝桥杯c++·c++蓝桥杯·蓝桥杯选拔赛
Jelena技术达人16 分钟前
淘宝/天猫按图搜索(拍立淘)item_search_img API接口实战指南
算法·图搜索算法
大锦终18 分钟前
【Linux】进程间通信
linux·运维·服务器·c++
闪电麦坤9521 分钟前
C/C++项目练习:命令行记账本
开发语言·c++
Adorable老犀牛27 分钟前
阿里云-基于通义灵码实现高效 AI 编码 | 8 | 上手实操:LeetCode学习宝典,通义灵码赋能算法高效突破
学习·算法·leetcode
望获linux32 分钟前
【实时Linux实战系列】规避缺页中断:mlock/hugetlb 与页面预热
java·linux·服务器·数据库·chrome·算法
菜就多练,以前是以前,现在是现在34 分钟前
Codeforces Round 1048 (Div. 2)
数据结构·c++·算法