HUAWEI 机试题:运维日志排序

🌈 Scala 实现

题目描述:

  • 运维工程师采集到某产品线网运行一天产生的日志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个时间。

输出描述:

  • 按时间升序排序之后的时间,如果有两个时间表示的时间相同,则保持输入顺序。

示例:

输入:

  • 2
  • 01:41:8.9
  • 1:1:09.211

输出:

  • 1:1:09.211
  • 01:41:8.9

输入:

  • 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

输入:

  • 2

  • 22:41:08.023

  • 22:41:08.23

输出:

  • 22:41:08.023

  • 22:41:08.23

代码:

def main(args: Array[String]): Unit = {

    val scan = new Scanner(System.in)
    // 获取输入日志条数
    val count = scan.nextLine().toInt

    // 存放日志
    var logs = ListBuffer[Tuple3[Integer, String, Integer]]()
    // 获取输入的日志
    for (i <- 1 to count) {
        var str = scan.nextLine()
        logs.append(Tuple3(i, str, getMillisecond(str)))
    }

    // 实现排序
    logs
    .sortWith((o1, o2) => {
        if (!o1._3.equals(o2._3)) {
            o1._3.compareTo(o2._3) < 0 // 按时间升序排序之后的时间
        } else {
            o1._1.compareTo(o2._1) < 0 // 如果有两个时间表示的时间相同,则保持输入顺序
        }
    })
    .foreach(log => println(log._2)) // 输出排序后的结果

}

def getMillisecond(str: String): Int = {
    val time = str.split(":")
    val hour = time(0).toInt * 60 * 60 * 1000
    val minute = time(1).toInt * 60 * 1000
    val second = time(2).split("\\.")(0).toInt * 1000
    val millisecond = time(2).split("\\.")(1).toInt
    hour + minute + second + millisecond
}

 


❤️ END ❤️
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值