目录
运维工程师采集到某产品线网运行一天产生的日志n条,现需根据日志时间先后顺序对日志进行排序,日志时间格式为H:M:S.N。
时间可能并没有补全,也就是说,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
- /* JavaScript Node ACM模式 控制台输入获取 */
- const readline = require("readline");
-
- const rl = readline.createInterface({
- input: process.stdin,
- output: process.stdout,
- });
-
- const lines = [];
-
- rl.on("line", (line) => {
- lines.push(line);
- if (lines.length - 1 === parseInt(lines[0])) {
- lines.shift();
- sortLog(lines);
- lines.length = 0;
- }
- });
-
- /* 日志排序 */
- function sortLog(logs) {
- logs.sort((log1, log2) => {
- const a = convert(log1);
- const b = convert(log2);
- return a - b;
- });
- console.log(logs.join("\n"));
- }
-
- /* 利用正则捕获组,将时间每部分提取出来 */
- function convert(log) {
- const [_, H, M, S, N] = /(\d+):(\d+):(\d+).(\d+)/.exec(log);
- return (
- parseInt(H) * 60 * 60 * 1000 +
- parseInt(M) * 60 * 1000 +
- parseInt(S) * 1000 +
- parseInt(N)
- );
- }
首先需要解决的问题是,ACM模式下,输入指定行数后运行程序的需求。
其实很简单,就是将每次控制台的输入都加入同一个数组lines中,第一个输入必然是“行数”,其余输入是具体数据。
我们只需要在 lines.length - 1 === lines[0] 时,运行程序即可。
其次是,排序日志时间用到的知识是:
挺简单的。其他解法的大体思路也应该差不多。