题解 | #简单错误记录#

简单错误记录

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]);
    }
}
#华为机考##题解##华为机试题#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务