题解 | #简单错误记录#
简单错误记录
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]); } }#华为机考##题解##华为机试题#