华为OD机考双机位C卷 - 运维日志排序 (Java Python JS GO C++ C)

华为OD机考双机位C卷 - 运维日志排序 (Java  Python  JS  GO  C++  C) 运维日志排序2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述[运维工程师]采集到某产品线网运行一天产生的日志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表示日志条数1n100000接下来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说明说明 两个时间表示的时间相同保持输入顺序解题思路解题思路分析题目本质这道题实质上是一个日志时间排序问题核心在于如何正确解析不标准格式的时间字符串并按时间顺序排序。时间统一化处理将各种格式的时间字符串转换为统一的数值单位如毫秒总数这样可以直接通过数值比较来确定时间的先后顺序解析时间字符串使用正则表达式或字符串分割方法解析时间字符串提取出小时、分钟、秒、毫秒四个部分注意处理没有前导零的情况如1:1:1.1时间转换算法将时间转换为统一单位毫秒总数计算公式(((小时 * 60) 分钟) * 60 秒) * 1000 毫秒排序实现使用稳定排序算法题目要求相同时间保持输入顺序基于转换后的时间数值进行排序输出排序后的原始时间字符串边界情况处理确保正确处理可能的时间格式变体处理日志数量范围1≤n≤100000Javaimportjava.util.*;importjava.util.regex.*;publicclassMain{/* 将时间字符串转换为毫秒数 */publicstaticintconvertToMillisecond(StringtimeStr){PatternpatternPattern.compile((\\d):(\\d):(\\d).(\\d));Matchermatcherpattern.matcher(timeStr);returnmatcher.find()?((Integer.parseInt(matcher.group(1))*60Integer.parseInt(matcher.group(2)))*60Integer.parseInt(matcher.group(3)))*1000Integer.parseInt(matcher.group(4)):0;}publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);ListStringlogsnewArrayList();intnscanner.nextInt();scanner.nextLine();// 忽略换行符for(inti0;in;i){Stringlogscanner.nextLine();logs.add(log);}/* 日志排序 */Collections.sort(logs,newComparatorString(){publicintcompare(Stringlog1,Stringlog2){inttime1convertToMillisecond(log1);inttime2convertToMillisecond(log2);returntime1-time2;}});for(Stringlog:logs){System.out.println(log);}}}PythonimportredefconvertToMillisecond(timeStr):hour,minute,second,millisecondmap(int,re.findall(r\d,timeStr))returnhour*60*60*1000minute*60*1000second*1000millisecond logs[]nint(input())foriinrange(n):loginput()logs.append(log)# 日志排序logs.sort(keylambdalog:convertToMillisecond(log))forloginlogs:print(log)JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});constlogs[];letn;rl.on(line,(input){if(!n){nparseInt(input);}else{logs.push(input);}if(logs.lengthn){/* 日志排序 */logs.sort((log1,log2){consttime1convertToMillisecond(log1);consttime2convertToMillisecond(log2);returntime1time2?-1:1;});for(constlogoflogs){console.log(log);}rl.close();}});functionconvertToMillisecond(timeStr){constmatchtimeStr.match(/(\d):(\d):(\d).(\d)/);return(parseInt(match[1])*3600000)(parseInt(match[2])*60000)(parseInt(match[3])*1000)parseInt(match[4]);}C#includeiostream#includevector#includeregex#includealgorithmusing namespace std;intconvertToMillisecond(string timeStr){regexpattern((\\d):(\\d):(\\d).(\\d));smatch matcher;returnregex_search(timeStr,matcher,pattern)?((stoi(matcher[1])*60stoi(matcher[2]))*60stoi(matcher[3]))*1000stoi(matcher[4]):0;}intmain(){vectorstringlogs;intn;cinn;cin.ignore();// 忽略换行符for(inti0;in;i){string log;getline(cin,log);logs.push_back(log);}/* 日志排序 */sort(logs.begin(),logs.end(),[](conststringlog1,conststringlog2){inttime1convertToMillisecond(log1);inttime2convertToMillisecond(log2);returntime1time2;});for(conststringlog:logs){coutlogendl;}return0;}GOpackagemainimport(bufiofmtosregexpsortstrconv)// 将时间字符串转换为毫秒数funcconvertToMillisecond(timeStrstring)int{pattern:regexp.MustCompile((\d):(\d):(\d)\.(\d))matches:pattern.FindStringSubmatch(timeStr)iflen(matches)0{hours,_:strconv.Atoi(matches[1])minutes,_:strconv.Atoi(matches[2])seconds,_:strconv.Atoi(matches[3])milliseconds,_:strconv.Atoi(matches[4])return((hours*60minutes)*60seconds)*1000milliseconds}return0}funcmain(){scanner:bufio.NewScanner(os.Stdin)// 读取日志条数scanner.Scan()n,_:strconv.Atoi(scanner.Text())// 读取所有日志logs:make([]string,n)fori:0;in;i{scanner.Scan()logs[i]scanner.Text()}// 日志排序sort.Slice(logs,func(i,jint)bool{time1:convertToMillisecond(logs[i])time2:convertToMillisecond(logs[j])returntime1time2})// 输出排序后的日志for_,log:rangelogs{fmt.Println(log)}}C语言#includestdio.h#includestdlib.h#includestring.h/* 将时间字符串转换为毫秒数 */intconvertToMillisecond(constchar*timeStr){inthours0,minutes0,seconds0,milliseconds0;sscanf(timeStr,%d:%d:%d.%d,hours,minutes,seconds,milliseconds);return((hours*60minutes)*60seconds)*1000milliseconds;}/* 比较函数用于qsort */intcompare(constvoid*a,constvoid*b){constchar**log1(constchar**)a;constchar**log2(constchar**)b;inttime1convertToMillisecond(*log1);inttime2convertToMillisecond(*log2);returntime1-time2;}intmain(){intn;scanf(%d,n);getchar();// 忽略换行符char**logs(char**)malloc(n*sizeof(char*));for(inti0;in;i){logs[i](char*)malloc(50*sizeof(char));// 假设每个时间字符串长度不超过50fgets(logs[i],50,stdin);// 去除fgets输入中的换行符logs[i][strcspn(logs[i],\n)]\0;}/* 对日志进行排序 */qsort(logs,n,sizeof(char*),compare);/* 输出排序后的日志 */for(inti0;in;i){printf(%s\n,logs[i]);free(logs[i]);// 释放每个日志字符串的内存}free(logs);// 释放日志指针数组的内存return0;}完整用例用例12 01:41:8.9 1:1:09.211用例23 23:41:08.023 1:1:09.211 08:01:22.0用例32 22:41:08.023 22:41:08.23用例45 10:00:00.001 11:00:00.002 12:00:00.003 13:00:00.004 14:00:00.005用例54 12:30:00.001 15:45:00.002 09:00:00.003 18:20:00.004用例66 01:01:01.001 02:02:02.002 03:03:03.003 04:04:04.004 05:05:05.005 06:06:06.006用例710 23:59:59.999 00:00:00.001 12:00:00.000 01:01:01.001 02:02:02.002 03:03:03.003 04:04:04.004 05:05:05.005 06:06:06.006 07:07:07.007用例87 12:30:00.001 15:45:00.002 09:00:00.003 18:20:00.004 01:01:01.001 02:02:02.002 03:03:03.003用例96 1:1:09.211 01:41:8.9 08:01:22.0 23:41:08.023 00:00:00.001 12:00:00.000用例104 12:00:00.000 00:00:00.001 23:59:59.999 06:30:45.123文章目录运维日志排序题目描述输入描述输出描述示例1示例2示例3解题思路解题思路分析题目本质JavaPythonJavaScriptCGOC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10