Java题解 | HJ19 #简单错误记录#
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
描述
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是“相同”的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
数据范围:错误记录数量满足 1 \le n \le 100 \1≤n≤100 ,每条记录长度满足 1 \le len \le 100 \1≤len≤100
输入描述:
每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
输出描述:
将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:
示例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不会被记录。
解法
该题考察字符串的操作。由于涉及到重复判断,适合使用哈希结构。循环纪录适合使用队列,先进先出。
/*
* Copyright (c) waylau.com, 2022. All rights reserved.
*/
package com.waylau.nowcoder.exam.oj.huawei;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
/**
* HJ19 简单错误记录.
* 描述:开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
* 处理:
* 1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。
* 对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)
* 和行号完全匹配的记录才做算是“相同”的错误记录。
* 2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
* 3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,
* 如果它们的名字的后16个字符相同,也被视为相同的错误记录
* 4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
* 数据范围:错误记录数量满足1≤n≤100 ,每条记录长度满足1≤len≤100
* 输入描述:每组只包含一个测试用例。一个测试用例包含一行或多行字符串。
* 每行包括带路径文件名称,行号,以空格隔开。
* 输出描述:将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开
*
* @author <a href="https://waylau.com">Way Lau</a>
* @since 2022-08-13
*/
public class HJ019SimpleErrorRecord {
public static void main(String[] args) {
// 输入
Scanner sc = new Scanner(System.in);
// 键为文件名+行数,值为文件出现次数
Map<String, Integer> fileMap = new HashMap<String, Integer>();
// 队列方式实现循环纪录文件名+行数
Queue<String> fileQueue = new ArrayBlockingQueue<String>(
8);
while (sc.hasNext()) {
String line = sc.nextLine();
String[] lineSplit = line.split(" ");
String fileName = lineSplit[0];
String lineNumber = lineSplit[1];
String[] splitFileName = fileName.split("\\\\");
String lastFileName = splitFileName[splitFileName.length
- 1];
int lastFileNameLen = lastFileName.length();
String shortName = lastFileName;
if (lastFileNameLen > 16) {
// 文件名截短
shortName = lastFileName
.substring(lastFileNameLen - 16);
}
// 键为文件名+行数
String key = shortName + " " + lineNumber;
// 文件不曾出现过,则同时计入到哈希和队列中;
// 文件如出现过,则只需要更新哈希的值
Integer count = fileMap.get(key);
if (count == null) {
count = 1;
// 超过8,要删除历史的纪录
if (fileQueue.size() == 8) {
fileQueue.remove();
}
fileQueue.add(key);
} else {
count++;
}
fileMap.put(key, count);
}
// 输出
fileQueue.forEach(key -> {
System.out
.println(key + " " + fileMap.get(key));
});
// 关闭
sc.close();
}
}
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html
#华为机考#