题目主要信息
1、开发一个记录功能小模块,可以记录出错的代码所在的文件名称和行号。
2、最多可记录8条错误记录,只用输出最后出现八条错误记录。针对相同过的错误记录只记录一条,但数量增加。(最后一个斜杠后面的带后缀名的部分,保留最后16位,和行号完全匹配的记录算相同的记录)
3、超过16个字符的文件名称 只记录最后的16位
4、输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
5、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
6、每组只包含一个测试用例,一个测试用例包含一行或多行字符串。每行包含带路径文件名和行号。
方法一:直接暴力
具体方法
将每一个数据都存入到HashMap中,最后输出的时候只输出8个即可。
由于过于简单,就不画图了,理解不难。
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));
}
}
复杂度分析
- 时间复杂度:,只需要遍历所有的错误记录。
- 空间复杂度:,一个额外的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++;
}
}
}
复杂度分析
- 时间复杂度:,只需要遍历所有的错误记录。
- 空间复杂度:,一个额外的HashMap。