运维日志排序
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
#include<stdio.h>#include<stdlib.h>typedefstruct{longlongt;intidx;chars[20];}Time;// 自定义排序 时间升序,时间相同按照输入顺序intcmp(constvoid*a,constvoid*b){Time*ta=(Time*)a,*tb=(Time*)b;returnta->t!=tb->t?(ta->t-tb->t):ta->idx-tb->idx;}intmain(){intn,H,M,S,N;scanf("%d",&n);Time*arr=malloc(n*sizeof(Time));for(inti=0;i<n;i++){scanf("%s",arr[i].s);sscanf(arr[i].s,"%d:%d:%d.%d",&H,&M,&S,&N);// 统一转换为毫秒arr[i].t=(longlong)H*3600000+M*60000+S*1000+N;arr[i].idx=i;}// 自定义排序qsort(arr,n,sizeof(Time),cmp);// 输出结果for(inti=0;i<n;i++)printf("%s\n",arr[i].s);free(arr);return0;}