题解 | #简单错误记录#
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
// 初始思路:(正确,但可优化)
/*
变量:
用Map,key为:文件名+空格+代码行号,value为:数目
用List,存放map的key
过程:
遍历输入,如果是“相同”的错误记录(通过map的containsKey判断),则跳过,
否则add到list中,
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Map<String, Integer> map = new HashMap<>();
List<String> list = new LinkedList<>();
while (in.hasNextLine()) {
String s = in.nextLine();
String key = getFileName(s) + " " + getCodeLineNum(s);
if (map.containsKey(key)) {
map.put(key, map.get(key) + 1);
} else {
map.put(key, 1);
list.add(key);
}
}
// 输出list, 如果size<=8,全部输出,否则输出后8个
// 确定起始下标i, 最后遍历list的[i:结尾]
int i = 0;
if (list.size() > 8) // 如果大于8个才需修改i,否则i保持为0
i = list.size() - 8;
for (; i < list.size(); i++) {
System.out.println(
list.get(i) + " " + map.get(list.get(i))
);
}
}
// 获取输入用例的文件名
private static String getFileName(String s) {
// 先以空格分割,再以‘\’分割 (注意:split方法使用正则表达式去匹配,在java中\\表示一个字符'\',而正则中用\\表示字符'\',所以最后要用java的\\\\解析为正则的\\)
String[] words = s.split(" ")[0].split("\\\\");
s = words[words.length - 1]; // 获取最后的字符串,即为去掉路径后的文件名
if (s.length() > 16) { // 如果文件名大于16个字符,则取最后16个字符
s = s.substring(s.length() - 16, s.length());
}
return s;
}
// 获取输入用例的代码行号
private static int getCodeLineNum(String s) {
return Integer.parseInt(s.split(" ")[1]);
}
}#华为机考##题解##华为机试题#
阿里云成长空间 747人发布