题目主要信息

1、开发一个记录功能小模块,可以记录出错的代码所在的文件名称和行号。

2、最多可记录8条错误记录,只用输出最后出现八条错误记录。针对相同过的错误记录只记录一条,但数量增加。(最后一个斜杠后面的带后缀名的部分,保留最后16位,和行号完全匹配的记录算相同的记录)

3、超过16个字符的文件名称 只记录最后的16位

4、输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录

5、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准

6、每组只包含一个测试用例,一个测试用例包含一行或多行字符串。每行包含带路径文件名和行号。

方法一:直接暴力

具体方法

将每一个数据都存入到HashMap中,最后输出的时候只输出8个即可。

由于过于简单,就不画图了,理解不难。 alt

Java代码

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        HashMap<String, Integer> map = new LinkedHashMap<String, Integer>();
        while (sc.hasNext()) {
            String str = sc.next();
            int LineNum = sc.nextInt();
            String[] split = str.split("\\\\");  //根据\分割
            String FileName = split[split.length - 1];
            //只保留最后16位
            if (FileName.length() > 16)
                FileName = FileName.substring(FileName.length() - 16);
            String key = FileName + " " + LineNum;
            //放入到HashMap中
            int Number = 1;
            if(map.containsKey(key))
                map.put(key, map.get(key)+1);
            else {
                map.put(key, Number);
            }
        }
        int count = 0;
        for(String string:map.keySet()){
            count++;
            if(count>(map.keySet().size()-8)) //输出最后八个记录
                System.out.println(string+" "+map.get(string));
        }
    }
    
   

复杂度分析

  • 时间复杂度:O(n)O(n),只需要遍历所有的错误记录。
  • 空间复杂度:O(n)O(n),一个额外的HashMap。

方法二:流入读入

具体方法

基本与思路一一样,只是换种读取的方法,BufferedReader 读取速度会比Scanner快。

Java代码

import java.io.*;
        import java.util.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        HashMap<String,Integer> map = new LinkedHashMap<String,Integer>();
        String str=null;
        while((str = bf.readLine()) != null){      //&& !tstr.equals(""))没有性能影响
            String[] split = str.split("\\s+");
            String FileName = split[0].substring(split[0].lastIndexOf("\\")+1);
            String key = FileName.substring(Math.max(FileName.length()-16 ,0))+" "+ split[1];  //max 最快推荐 ?:也可以 if太麻烦
            int value=1;
            if(map.containsKey(key))
                map.put(key, map.get(key)+1);
            else {
                map.put(key, value);
            }
        }
        int cnt=0;
        for(HashMap.Entry<String,Integer> it:map.entrySet()){
            if(map.size()-cnt<=8)
                System.out.println(it.getKey()+" "+it.getValue());
            cnt++;
        }
    }
}

复杂度分析

  • 时间复杂度:O(n)O(n),只需要遍历所有的错误记录。
  • 空间复杂度:O(n)O(n),一个额外的HashMap。