题解 | #简单错误记录#

简单错误记录

http://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb

题目主要信息

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。
华为机试 文章被收录于专栏

本专栏主要用于分享华为机试的题解,希望对大家有所帮助。

全部评论
牛逼,名字加条数做Kkey很帅,本来自己想的是多用Map单独维护重复的记录
1 回复 分享
发布于 2022-05-25 00:28
提个简化,int Number = 1; if(map.containsKey(key)) map.put(key, map.get(key)+1); else { map.put(key, Number); } 这一段代码可以用map.put(key,map.getOrDefault(key, 0) + 1);代替
5 回复 分享
发布于 2022-04-20 13:35
这while循环 是怎么结束的,不结束的话 怎么执行到后边的输出语句的... 我的也通过了 但我不知道他怎么走出循环的.放到idea上 就走不出循环,在这就能结束了
4 回复 分享
发布于 2022-08-30 10:14 贵州
厉害,用linked维持了有序性,再通过count成功跳过了前面的,最后成功输出了最后8条记录,大佬
2 回复 分享
发布于 2022-07-05 22:53
可使用stream的skip方法
点赞 回复 分享
发布于 2023-01-16 14:28 上海
int Number=1有点多余
点赞 回复 分享
发布于 2022-12-10 23:45 英国

相关推荐

评论
16
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务