首页 > 试题广场 >

简单错误记录

[编程题]简单错误记录
  • 热度指数:362240 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}在本题中,我们需要处理文件报错信息,其由出错文件的文件路径和错误行号组成。

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

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

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

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

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


输出描述:
\hspace{15pt}至多八行,每行先输出一个长度为 1 \leqq {\rm length}(s) \leqq 16 的字符串 s ,代表文件名;随后,在同一行输出错误行号、报错次数。
示例1

输入

D:\oblemsinnowcoder 12
D:\nowcoderproblemsinnowcoder 12
D:\nowcoder\problemsinnowcoder 13
D:\oj\problemsinnowcoder 13

输出

oblemsinnowcoder 12 2
oblemsinnowcoder 13 2

说明

\hspace{15pt}在这个样例中,这四条报错信息去除文件路径后,由于文件名长度均超过 16 个字符,故我们只保留最后 16 个字符,得到的文件名均为 \texttt{ 。所以,我们将它们看作同一个文件,按照报错行号划分即可。
示例2

输入

A:\aa 1
B:\b 1
C:\c 1
D:\d 1
E:\e 1
F:\f 1
G:\g 1
H:\h 1
I:\i 1
A:\aa 1

输出

b 1 1
c 1 1
d 1 1
e 1 1
f 1 1
g 1 1
h 1 1
i 1 1

说明

\hspace{15pt}在这个样例中,第一、十条报错信息完全相同,但是我们以其第一次出现的顺序为准,在输出最后 8 条记录时,不包含这一报错。
示例3

输入

D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645
E:\je\rzuwnjvnuz 633
C:\km\tgjwpb\gy\atl 637
F:\weioj\hadd\connsh\rwyfvzsopsuiqjnr 647
E:\ns\mfwj\wqkoki\eez 648
D:\cfmwafhhgeyawnool 649
E:\czt\opwip\osnll\c 637
G:\nt\f 633
F:\fop\ywzqaop 631
F:\yay\jc\ywzqaop 631
D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645

输出

rzuwnjvnuz 633 1
atl 637 1
rwyfvzsopsuiqjnr 647 1
eez 648 1
fmwafhhgeyawnool 649 1
c 637 1
f 633 1
ywzqaop 631 2
const rl = require("readline").createInterface({ input: process.stdin });
const lines = [];
rl.on("line", (res) => {
    lines.push(res);
});
// 首先我需要有个排序索引,索引可以设置为第一次出现的行号(指在数据行index)
// 其次我需要一个map存储历史报错信息,key设置为文件名,对象内容中有个key是行号, 对应每行出现的异常次数
rl.on("close", () => {
    const nameMap = {};
    const lineErrMap = {};
    for (let i = 0; i < lines.length; i++) {
        const [file, lineNum] = lines[i].split(" ");
        
        let fileName = file.split("\\").pop();
        fileName = fileName.substring(fileName.length - 16, fileName.length);
        if (nameMap[fileName]) { // 历史出现过相同名字的错误
            let target = nameMap[fileName][lineNum];
            if (target) {
                // 同一个文件某一行报错出现过
                nameMap[fileName][lineNum].sum = nameMap[fileName][lineNum].sum + 1;
                const first = nameMap[fileName][lineNum].index;
                lineErrMap[first].count = lineErrMap[first].count + 1;
            } else {
                // 同一个文件某一行报错未出现过
                nameMap[fileName][lineNum] = {
                    sum: 1,
                    index: i,
                }
                lineErrMap[i] = {
                    fileName,
                    lineNum,
                    count: 1
                }
            }
        } else { // 历史未出现过相同名称的错误, 直接push
            nameMap[fileName] = {
                [lineNum]: {
                    sum: 1,
                    index: i,
                }
            }
            lineErrMap[i] = {
                fileName,
                lineNum,
                count: 1
            }
        }
    }
    let keys = Object.keys(lineErrMap);
    let start = keys.length > 8 ? keys.length - 8 : 0;
    for(let i=start; i<keys.length; i++) {
        const lineItem = lineErrMap[keys[i]];
        console.log(`${lineItem.fileName} ${lineItem.lineNum} ${lineItem.count}`);
    }

});

发表于 2025-05-10 12:26:50 回复(0)
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  // Get standard filename from filepath
  function parseFilename(path) {
    const reg = /([C-Z]:\\)?([a-zA-Z]+\\)*([a-zA-Z]+)/;
    let filenameArr = path.match(reg);
    if (!filenameArr) return null;
    let filename = filenameArr[filenameArr.length - 1];
    if (filename.length > 16) {
      return filename.slice(filename.length - 16);
    }
    return filename;
  }

  // Return true if both filename and line number are same
  function isDuplicatedRecord(map, arr) {
    let flag = 0;
    map.forEach((value, key, map) => {
      if (Array.isArray(key) && arr[0] === key[0] && arr[1] === key[1]) {
        map.set(key, ++value);
        flag++;
      }
    });

    if (flag > 0) return true;
    return false;
  }

  // Get input stream [n][2]
  let inputData = [];
  let i = 0;
  while ((line = await readline())) {
    let tokens = line.split(" ");
    inputData[i] = tokens;
    i++;
  }

  // Sorted input data
  inputData.map((i) => {
    i[0] = parseFilename(i[0]);
  });

  let records = new Map();
  let trash = new Map();
  inputData.forEach((item) => {
    // Is the same record?
    // Just add count if true
    // Add it into map if false
    if (
      !isDuplicatedRecord(records, item) &&
      !isDuplicatedRecord(trash, item)
    ) {
      if (records.size === 8) {
        // Move the oldest record into trash
        let firstKey = records.keys().next().value;
        trash.set(firstKey, records.get(firstKey));
        records.delete(firstKey);
      }
      // Set new record
      records.set(item, 1);
    }
  });

  records.forEach((value, key) => console.log(`${key[0]} ${key[1]} ${value}`));
})();

发表于 2023-02-25 13:56:33 回复(0)
/*
                    +--------------------+
                    |E:\je\rzuwnjvnuz 633|
             +------+     split(" ")     +--------+
             |      +--------------------+        |
   +---------v---------+                      +---v---+
   |       [0]         |                      |  [1]  |
   |      path         |                      |  row  |
   |                   |                      |       |
   |  E:\je\rzuwnj^nuz |                      |  633  |
   +---------+---------+                      +----+--+
             |                                     |
     +-------v-------+                             |
     |  split("\\")  |                             |
     +-------+-------+                             |                          +-----------+
             |                                  +------------------------+    |  False    |
+------------v-------------+                    |--------------+  |string|    |           |
|      path segment        |          +-------> ||isRecoderSame+-------------->  add {}   |
|            +             |          |         |--------------+  | row  |    |  count ++ |
|            |             |          |         +-----------------+------+    +-----------+
|            |             |          |                    |
|            v             |          |                    | True
+------------+-------------+          |                    |
|  path segment[length-1]  |          |                    v
|                          |          |           +--------+---------+
|       rzuwnjvnuz         |          |           |                  |
|                          |          |           |     count ++     |
+------------+-------------+          |           |                  |
             |                        |           +------------------+
     +-------v--------+               |
     |  substr(-1,16) |               |
     +----------------+               |
                                      |
         rzuwnjvnuz   +---------------+
*/

const readline = require('readline');
let map = new Map()
// 哈希表是无序的
let count =1
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
rl.on('line', function (line) {
    let pathes = line.split(" ")
    let row = +pathes[1]
    let path = pathes[0]
    
   let recoderName = path.substr((path.lastIndexOf("\\"))+1).substr(-16)
    isRecoderSame(recoderName+" "+row,row)
    
});
rl.on("close",function(line){
    let recoder = Array.from(map.keys())
   let count = Array.from(map.values())
   //console.log(recoder,count)
  
  
    if(recoder.length<=8){
          for(let i = 0;i<recoder.length;i++){
          console.log(recoder[i]+" "+count[i])
      }
    }else{
     for(let i = recoder.length-8;i<recoder.length;i++){
         console.log(recoder[i]+" "+count[i])
     }
    }
    
})
function isRecoderSame(recoder,row){
    
    if(map.has(recoder)){
        
        map.set(recoder,map.get(recoder)+1)
        
    }else{
        map.set(recoder,count)
    }
}
Node 日常没有题解。。。。
这一题的难点在于 Map的Key的设计,因为要考虑到只有行数和文件名都相同的情况,count才会加一
发表于 2022-03-20 22:02:21 回复(0)
let res = [];
let str;
while (str = readline()) {
    let item = str.split(' ');
    let index = item[0].lastIndexOf('\\');
    let filename = item[0].substr(index + 1).slice(-16);
    let num = item[1];
    let has = false;
    for(let i = 0; i < res.length; i++) {
        if(res[i].filename === filename && res[i].line === num) {
            res[i].count++;
            has = true;
        }
    }
    
    if (!has) {
        res.push({
            filename: filename,
            line: num,
            count: 1
        })
    }
}

let ret = res.slice(-8);
for(let j = 0; j < ret.length; j++) {
    let d=ret[j];
    console.log(`${d.filename} ${d.line} ${d.count}`)
}
发表于 2021-07-02 16:29:56 回复(0)
错误记录8个,是把所有的错误读完并处理完之后,取最后8个。一开始以为就是记录最后的那8+(可能包含几个重复的),所以就从后往前读了,后来虽然发现不是这样的,就还这样写吧🤣。
let arr = [],arr2 = [];
let s = '';
let obj = {};
while(line = readline()){
    arr.push(line);
}
arr = arr.reverse();
for(let i=0; i < arr.length ; i++){
    let a  = arr[i].split(' ')[0].split('\\').pop();
    let b  = arr[i].split(' ')[1];
    if(a.length > 16){
        a = a.slice(a.length-16);
    }
    s = a + ' ' + b;
    if(!obj[s]){
        obj[s] = 1
    }else{
        let num = obj[s];
        delete obj[s];
        obj[s] = num+1;
    }
}
for(let key in obj){
    arr2.push(key+' '+ obj[key]);
}
arr2 = arr2.slice(0,8).reverse();
arr2.forEach(item => console.log(item));


发表于 2021-06-13 06:54:14 回复(0)
let res = [];
let str;

while(str = readline()) {
    const item = str.split(' ');
    let fileName = item[0].split('\\').slice(-1)[0].slice(-16);
    const line = +item[1];
   
    let has = false;
    
    res.forEach(d => {
        if(d.fileName === fileName && d.line === line) {
            d.count++;
            has = true;
        }
    })
    
    if(!has) {
        res.push({fileName, line, count: 1}); 
    }
}


const ans = res.slice(-8);

for(let i=0; i<ans.length;i++) {
    const d = ans[i];
    console.log(`${d.fileName} ${d.line} ${d.count}`)
}

发表于 2021-05-03 23:17:04 回复(0)
let data = readline();
let filterArr = [];
let obj = {};
while (data) {
    let arr = data.split(' ')
    let str = arr[0].split('\\').pop()
    if(str.length>16){
        str = str.slice(str.length-16)
    }
    let key = str+' '+arr[1]
    if(filterArr.includes(key)){
        obj[key]++
    }else{
        obj[key] = 1
        filterArr.push(key)
    }
    data = readline();
    if(!data){
        filterArr.slice(filterArr.length-8).map(key=>{
            console.log(`${key} ${obj[key]}`)
        })
    }
}
发表于 2021-04-16 14:21:44 回复(0)
var resultAr = new Map();
var res = new Array();
while (line = readline()){
    name = line.slice(line.lastIndexOf("\\")+1)
    if(resultAr.has(name)){
        let count= resultAr.get(name)+1
        resultAr.set(name,count)
    }else{
         resultAr.set(name,1)
    }    
}
resultAr.forEach((value,key)=>{
    if(key.split(' ')[0].length>16){
        key=key.split(' ')[0].slice(key.split(' ')[0].length-16)+' '+key.split(' ')[1]
    }
    res.push(key+' '+value)
    if(res.length>8){
        res.shift()
    }
})
res.forEach((item)=>{
    console.log(item)
})
 题目认真读完两遍思路就很清晰了,这题不难吧
编辑于 2020-12-13 11:05:32 回复(0)
var ar=[];
while(line = readline()){
    var addArr = line.split();
    var arr = line.split("\\");
    var str = arr[arr.length-1];
    ar.push(str);
}

var qw=[];
for(var i = 0;i<ar.length;i++){
    var num=0;
    for(var k = 0;k<ar.length;k++){
     if(ar[i]=== ar[k]){
         num++;
     }
    }
    qw.push(ar[i]+" "+num);
}
qw = [...new Set(qw)];
for(var k = 0;k<qw.length;k++){
    if(qw[k].split(" ")[0].length>16){
         var str = qw[k].split(" ")[0];
        str = str.substr(str.length-16,str.length);
        qw[k]= str + " "+qw[k].split(" ")[1]+ " "+qw[k].split(" ")[2];
    }
}

if(qw.length>8){
  for(var j = qw.length-8;j<qw.length;j++){
         console.log(qw[j]);
}  
}else{
   for(var j = 0;j<qw.length;j++){
         console.log(qw[j]);
} 
}


发表于 2020-11-20 21:18:43 回复(0)
这题js实现不了吧
发表于 2020-10-27 12:15:34 回复(0)
var list = [];
var line;
while ((line = readline())) {
  var arr = line.split(" ");
  var lineNo = arr[arr.length - 1];
  let nameArr = arr[0].split("\\");
  let path = nameArr[nameArr.length - 1].slice(-16);
  let index = list.findIndex(v => v.path == path && v.lineNo == lineNo);
  if (index != -1) {
    list[index].count += 1;
  } else {
    list.push({ path, lineNo, count: 1 });
  }
}

var outList = list.slice(-8);
for (var i = 0; i < outList.length; i++) {
  console.log(
    outList[i].path + " " + outList[i].lineNo + " " + outList[i].count
  );
}
这道题非常坑,题目意思真模糊。需要注意以下几个点:
1.  错误记录8个,不是队列长度为8,不是读一个,进入队列。而是把所有的错误读完并处理完之后,取最后8个。
2. 对相同的错误记录(净文件名称和行号完全匹配),相同意思是截取后的16个长度的文件名和行号相同即可,不是完整的文件名相同,这点要注意,坑的不行。

注意好上面2点,题目就能做出来了
发表于 2020-02-26 15:44:15 回复(0)
我的json都是正确的 为什么输出是错的  我一直没搞明白这个多个输出的规则
let arr=[];
while(n=readline()){
arr.push(n);
}
let json=[];
for(let i = 0;i<arr.length;i++){
let array = arr[i].split(" ");
let ind = 0;
let add = array[0].split("\\");
if(json==[]){
json.push({
name:add[add.length-1],
line:array[1],
count:1
})
}else{
for(let j = 0;j<json.length;j++){
if(json[j].name == add[add.length-1]&&json[j].line == array[1]){
json[j].count+=1;
break;
}else{
ind++;
}
}
if(ind == json.length){
if(json.length==8){
json.shift();
}
json.push({
name:add[add.length-1],
line:array[1],
count:1
})
}
}
}
for(let m = 0;m<json.length;m++){
if(json[m].name.length>16){
console.log(json[m].name.substring(json[m].name.length-16)+" "+json[m].line+" "+json[m].count);
}else{
console.log(json[m].name+" "+json[m].line+" "+json[m].count);
}
}
编辑于 2019-12-29 17:15:55 回复(0)
var jilu = [];
var count = [];
while(str = readline()){
    var xinjilu = []
    var arr = str.split(' ');
    var strarr = arr[0].split('\\');
    var name = strarr[strarr.length - 1]
    if(name.length > 16){
        name = name.substr(name.length - 16)
    }
    name = name + ' ' + arr[1];
    if(jilu.indexOf(name) == -1){
        jilu.push(name);
        count.push(1);
    }else{
        count[jilu.indexOf(name)]++
    }
}
for(var i = jilu.length > 8 ? jilu.length - 8 : 0;i < jilu.length;i ++){
    print(jilu[i] + ' ' + count[i])
}
发表于 2019-03-15 15:48:10 回复(0)
hjk
发表于 2018-11-30 15:21:52 回复(0)
var readline = require('readline');
var errors={};
var files = [];
var path = require('path');
const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
});
rl.on('line', function(line){
  record(line);
}).on('close', function() {
  output();
});
function record(str) {
    errs = str.split(' ');
    filename = path.win32.basename(errs[0]);
    filename = filename.slice(-16,filename.length) + " " + errs[1];
    if (errors[filename]) {
        errors[filename]++;
    } else {
        errors[filename] = 1;
    }
    if (files.indexOf(filename) === -1) {
        files.push(filename);
    }
}
 function output() {
     files = files.slice(-8, files.length);
    for (var i=0; i< files.length; i++) {
        console.log(files[i],errors[files[i]]);
    }
 }

编辑于 2018-06-05 19:39:17 回复(0)

这道题的坑在于循环记录不能顶掉前面的记录,而是只输出最后8条记录。题意不明!


var readline = require('readline');
var errors={};
var files = [];
var path = require('path');
const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
});
rl.on('line', function(line){
  record(line);
}).on('close', function() {
  output();
});
function record(str) {
    errs = str.split(' ');
    filename = path.win32.basename(errs[0]);
    filename = filename.slice(-16,filename.length) + " " + errs[1];
    if (errors[filename]) {
        errors[filename]++;
    } else {
        errors[filename] = 1;
    }
    if (files.indexOf(filename) === -1) {
        files.push(filename);
    }
}
 function output() {
     files = files.slice(-8, files.length);
    for (var i=0; i< files.length; i++) {
        console.log(files[i],errors[files[i]]);
    }
 }
编辑于 2016-12-14 23:51:44 回复(0)