华为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 |
| 说明 | 两个时间表示的时间相同,保持其原有输出顺序。 |
| | |


解读与分析

题目解读:

给出一组时间,按照既定规则,对时间进行排序,如果两个时间相等,保持原有顺序。

分析与思路:

比较时间时,分 3 段比较,先比较小时,再比较分,最后比较秒。
比较小时和分的时候,注意数字可能有前导 0。当比较分时,不能直接比较小数的大小,它可能包含两部分:秒和毫秒,通过 "." 将他们分隔开,然后采用比较小时的方式分别比较秒和毫秒。

时间复杂度取决于排序算法,为 O(nlogn),空间复杂度为 O(n)。


代码实现

Java代码

java 复制代码
import java.util.Arrays;
import java.util.Scanner;
import java.util.Comparator;

/**
 * 日志排序
 * 
 * @since 2023.11.01
 * @version 0.1
 * @author Frank
 *
 */
public class LogSort {

    public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	while (sc.hasNext()) {
	    String input = sc.nextLine();
	    int count = Integer.parseInt(input);

	    String[] timeArr = new String[count];
	    for (int i = 0; i < count; i++) {
		input = sc.nextLine();
		timeArr[i] = input;
	    }
	    processLogSort(timeArr);
	}

    }

    private static void processLogSort(String[] timeArr) {
	Comparator<String> comp = new Comparator<String>() {
	    @Override
	    public int compare(String o1, String o2) {
		String[] o1Arr = o1.split(":");
		String[] o2Arr = o2.split(":");
		int[] o1Int = new int[4];
		int[] o2Int = new int[4];
		for (int i = 0; i < 2; i++) {
		    o1Int[i] = Integer.parseInt(o1Arr[i]);
		    o2Int[i] = Integer.parseInt(o2Arr[i]);
		}
        
        // 此处是正则表达式
		String[] second1Arr = o1Arr[2].split("\\.");
		String[] second2Arr = o2Arr[2].split("\\.");

		o1Int[2] = Integer.parseInt(second1Arr[0]);
		o2Int[2] = Integer.parseInt(second2Arr[0]);

		if (second1Arr.length == 2) {
		    o1Int[3] = Integer.parseInt(second1Arr[1]);
		}
		if (second2Arr.length == 2) {
		    o2Int[3] = Integer.parseInt(second2Arr[1]);
		}

		for (int i = 0; i < o1Int.length; i++) {
		    if (o1Int[i] == o2Int[i]) {
			continue;
		    }
		    return o1Int[i] - o2Int[i];
		}

		return 0;
	    }
	};
	Arrays.sort(timeArr, comp);
	for (int i = 0; i < timeArr.length; i++) {
	    System.out.println(timeArr[i]);
	}

    }

}

JavaScript代码

javascript 复制代码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
        var count = parseInt(line);

        var timeArr = new Array();
        for (var i = 0; i < count; i++) {
            line = await readline();
            timeArr[i] = line;
        }
        processLogSort(timeArr);
    }
}();

function processLogSort(timeArr) {
    var comp = function(o1, o2) {
        var o1Arr = o1.split(":");
        var o2Arr = o2.split(":");
        var o1Int = new Array();
        var o2Int = new Array();
        for (var i = 0; i < 2; i++) {
            o1Int[i] = parseInt(o1Arr[i]);
            o2Int[i] = parseInt(o2Arr[i]);
        }

        // 此处不是正则表达式
        var second1Arr = o1Arr[2].split(".");
        var second2Arr = o2Arr[2].split(".");

        o1Int[2] = parseInt(second1Arr[0]);
        o2Int[2] = parseInt(second2Arr[0]);

        if (second1Arr.length == 2) {
            o1Int[3] = parseInt(second1Arr[1]);
        } else {
            o1Int[3] = 0;
        }

        if (second2Arr.length == 2) {
            o2Int[3] = parseInt(second2Arr[1]);
        } else {
            o2Int[3] = 0;
        }

        for (var i = 0; i < o1Int.length; i++) {
            if (o1Int[i] == o2Int[i]) {
                continue;
            }
            return o1Int[i] - o2Int[i];
        }

        return 0;
    };
    timeArr.sort(comp);
    for (var i = 0; i < timeArr.length; i++) {
        console.log(timeArr[i]);
    }
}

(完)

相关推荐
aWty_39 分钟前
实分析入门(11)--Cantor三分集
学习·数学·算法·实变函数
兰令水39 分钟前
leecodecode【二叉树递归+对称】【2026.6.1打卡-java版本】
算法
AI人工智能+电脑小能手7 小时前
【大白话说Java面试题 第87题】【Mysql篇】第17题:分布式事务的实现原理?
java·数据库·分布式·mysql·面试
来杯@Java8 小时前
图书管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·mybatis·课程设计
小陈同学呦8 小时前
前端如何处理订单状态导航的数据竞态问题
前端·javascript
开发者每周简报9 小时前
网海三部曲·无名宗师传
javascript·人工智能
地平线开发者9 小时前
profiler debug 工具用法与高一致性策略
算法·自动驾驶
卷毛的技术笔记9 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
编程大师哥9 小时前
匿名函数 lambda + 高阶函数
java·python·算法
東雪木9 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试