首页 > 试题广场 >

简单错误记录

[编程题]简单错误记录
  • 热度指数:339061 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。


处理:


1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是相同的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准

数据范围:错误记录数量满足 ,每条记录长度满足

输入描述:

每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。



输出描述:

将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:

示例1

输入

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

说明

由于D:\cfmwafhhgeyawnool 649的文件名长度超过了16个字符,达到了17,所以第一个字符'c'应该被忽略。
记录F:\fop\ywzqaop 631和F:\yay\jc\ywzqaop 631由于文件名和行号相同,因此被视为同一个错误记录,哪怕它们的路径是不同的。
由于循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准,所以D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645不会被记录。  
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)

问题信息

难度:
16条回答 66137浏览

热门推荐

通过挑战的用户

查看代码