运维日志排序
2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型
华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解
其它语言题解链接
华为OD机试双机位C卷 - 运维日志排序 (Python & C++ & JAVA & JS & GO)
题目描述
运维工程师采集到某产品线网运行一天产生的日志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
题解
思路
字符串处理 + 自定义排序题型
- 自定义结构体,保存每个日志时间的
原始字符串,时间转换为毫秒之后的值,输入顺序。 - 接受输入的时间字符串,提出每个字符串中的时、分、秒、毫秒值,统一转换为毫秒,保存至结构体数组中。
- 将结构体数组自定义排序按照
时间升序,时间相同按照输入顺序升序。 - 按顺序输出排序之后的日志记录原始字符串。
code
c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
long long t;
int idx;
char s[20];
} Time;
// 自定义排序 时间升序,时间相同按照输入顺序
int cmp(const void *a, const void *b) {
Time *ta = (Time*)a, *tb = (Time*)b;
return ta->t != tb->t ? (ta->t - tb->t ) : ta->idx - tb->idx;
}
int main() {
int n, H, M, S, N;
scanf("%d", &n);
Time *arr = malloc(n * sizeof(Time));
for (int i = 0; i < n; i++) {
scanf("%s", arr[i].s);
sscanf(arr[i].s, "%d:%d:%d.%d", &H, &M, &S, &N);
// 统一转换为毫秒
arr[i].t = (long long)H * 3600000 + M * 60000 + S * 1000 + N;
arr[i].idx = i;
}
// 自定义排序
qsort(arr, n, sizeof(Time), cmp);
// 输出结果
for (int i = 0; i < n; i++)
printf("%s\n", arr[i].s);
free(arr);
return 0;
}