Javascript题解 | #简单错误记录#
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
const rl = require('readline').createInterface({ input: process.stdin, output: process.stdout }); const inputs = []; rl.on('line', (line) => { inputs.push(line); }).on('close', () => { // 1. 处理原始inputs const valideOriginRecords = handleInputs(inputs); // 2. 取出 filename row const all_filename_row = handleOriginRecords(valideOriginRecords); // 3. 对取出的 filename row 进行 “相同”的处理, 这里就用 filename+row 做key 建立map const all_records_map = generatorRecordsMap(all_filename_row); // 4. 把map放进数组,取出最后有效的8条记录 const final_8_records = handleValidateRecords(all_records_map); // 5. 输出 print(final_8_records); }); // 5. 输出 function print(records) { for(let i = 0; i < records.length; i++) { const { filename, row, count } = records[i]; console.log(`${filename} ${row} ${count}`); } } // 4. 取出最后有效的8条记录 function handleValidateRecords(map) { let res = []; const temp = []; Object.keys(map).forEach(key => { temp.push(map[key]); }) if(temp.length > 8) { res = temp.slice(temp.length - 8); } else { res = temp; } return res; } // 3. map function generatorRecordsMap(all_filename_row) { let records_map = {}; for(let i = 0; i < all_filename_row.length; i++) { const { filename, row } = all_filename_row[i]; const key = filename + row; if(!Object.prototype.hasOwnProperty.call(records_map, key)) { records_map[key] = { filename, row, count: 1 } } else { records_map[key].count += 1; } } return records_map; } // 2. 取出filename row function handleOriginRecords(records) { let res = []; records.forEach(item => { const token = item.split(' '); const routers = token[0].slice(2).split("\\"); let filename = routers[routers.length - 1]; // 只记录文件的最后有效16个字符 if(filename.length > 16) { filename = filename.slice(filename.length - 16); } const temp = { filename, row: token[1] } res.push(temp); }) return res; } // 1. 去重 function handleInputs(inputs) { // 1. 去重 const unique_inpust = [...new Set(inputs)]; return unique_inpust; }
这道题,难度在于理解题意,本身是个设计实现应用类题自身难度不大。
我自己是提交了两次,根据测试用例和评论区才大致明白题意。有两坑点:如何理解循环记录 、怎么理解“重复”与“相同”的区别
根据题目,提炼出题目要求
理解题意:
1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是“相同”的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
上面是题目的要原要求,我们得出的规则如下:
- 所有输入完全重复的,只以第一次为准 —— 去重
- 匹配文件名和行号,文件名只记录最后16位以内有效字符 —— 字符匹配加处理
- 文件名和行号完全匹配记作“相同”—— 计数
- 循环记录,只输出最后8条 —— 输出
拿这个规则对应题目的测试用例比对,可以得到输出,那就按这个思路开干。
根据我们提炼出来的规则,就可以开始设计流程了:
所有完整输入去重 --> 截取文件名filename和行号row --> 计数这一步,采用Map, key = filename + row , value = { filename, row, count } --> Map 按key 将value传入数组,截取最后8条有效记录。
至此,这道题就完成了。