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 ❤️

版权声明:本文为weixin_47243236原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>