【较难】算法nodeJs:简单错误记录

110 阅读2分钟

描述

在本题中,我们需要处理文件报错信息,其由出错文件的文件路径和错误行号组成。

文件路径的前三个字母为大写字母 A-Z 、冒号 ":" 和反斜杠  ,代表盘符;随后是若干由小写字母构成的字符串,代表文件夹名,彼此使用单个反斜杠间隔。路径的最后一个反斜杠后是文件名。
我们只在乎文件名(即去掉除了文件名以外的全部信息),且至多保留文件名的最后 16 个字符。

随后,我们需要统计相同的报错信息:
∙如果两条报错信息保留后 16 个字符后的文件名相同,且行号相同,则视为同一个报错;

相同的报错信息以第一次出现的时间为准,至多输出最后 8 条记录。

输入描述:

本题将会给出 1≦T≦100 条报错信息,确切数字未知,您需要一直读入直到文件结尾;您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每条报错信息描述如下:

在一行上先输入一个长度为 1≦length(x)≦100 的字符串 x 代表文件路径;随后,在同一行输入一个整数 y(1≦y≦1000) 代表行号。
文件路径的格式如题干所述,保证文件名不为空。

输出描述:

至多八行,每行先输出一个长度为 1≦length(s)≦16 的字符串 s ,代表文件名;随后,在同一行输出错误行号、报错次数。

image.png

image.png

image.png

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    let arr = [];
    let save = {};
    let index = 0;
    let left = 0,
        right = 0;
    while ((line = await readline())) {
        let name, num;
        [name, num] = line.split(" ");
        name = name.split("\\");
        name = name[name.length - 1];
        if (name.length > 16) {
            name = name.slice(name.length - 16);
        }
        name = name + " " + num;
        // 名字后16字符+行号作为key
        if (!save[name]) {
            // 库里没有
            save[name] = { index: index, time: 1 };
            index++;
            right++;
            if (right - left > 8) {
                left++;
            }
        } else {
            if (save[name].index >= left) {
                save[name].time++;
            }
        }
    }
    for (let i in save) {
        if (save[i].index >= left && save[i].index <= right) {
            console.log(i + " " + save[i].time);
        }
    }
})();