题解 | #简单错误记录#

简单错误记录

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

题意整理。

  • 开发一个错误记录功能的小模块,能够记录出错的代码所在的文件名称和行号。
  • 输入字符串为“全路径名+空格+行号”的格式,输出字符串为“有效文件名+空格+行号+空格+出现次数”的格式。
  • 有如下处理规则:1.只记录出错的最后8条记录,如果有重复的,则计数加一;2.长度超过16的文件名称,只保留最后16个有效字符;3.只要有效字符相同,则视为相同的文件名;4.以第一次出错的时间为准。

方法一(模拟)

1.解题思路

  • 首先新建map,文件名+空格+行号作为键,对应的数量作为值。
  • 然后通过字符串分割,得到文件名,如果长度大于16,则只取最后有效16个字符。利用文件名和行号构造map的键。将对应的键放入map,如果出现过,则计数加1。(因为需要按时间先后,至多统计最后出错的8条记录,所以数据结构采用的LinkedHashMap,保证有序)
  • 最后遍历map,如果长度大于8,取最后8条记录,否则取所有的记录。

图解展示: alt

2.代码实现

import java.util.Scanner;
import java.util.LinkedHashMap;

public class Main{
    public static void main(String[] args){
        //标准输入
        Scanner sc=new Scanner(System.in);
        //新建map,文件名+空格+行号作为键,对应的数量作为值
        LinkedHashMap<String,Integer> map=new LinkedHashMap<>();
        while(sc.hasNext()){
            //输入字符串
            String s=sc.next();
            //行号
            int num=sc.nextInt();
            //分割路径
            String[] arr=s.split("\\\\");
            //得到文件名
            String strarr=arr[arr.length-1];
            //如果大于16,则只取最后有效16个字符
            if(strarr.length()>16){
                strarr=strarr.substring(strarr.length()-16);
            }
            //构造键
            String key=strarr+" "+num;
            //将对应数据放入map
            if(!map.containsKey(key)){
                map.put(key,1);
            }
            else{
                map.put(key,map.get(key)+1);
            }            
        }
        int n=map.size();
        for(String k:map.keySet()){
            //至多取最后8条记录
            if(n<=8){
                System.out.println(k+" "+map.get(k));
            }
            n--;
        }
    }
}

3.复杂度分析

  • 时间复杂度:假设错误记录的数量为n,需要遍历所有的错误记录,所以时间复杂度为O(n)O(n)
  • 空间复杂度:最坏情况下,需要额外大小为nn的map,所以空间复杂度为O(n)O(n)

方法二(利用io流)

1.解题思路

思路和方法一基本一致,不同的是通过io流操作来处理输入的数据。对于构造map键的方式,只需预先计算最后一个空格和"\"出现的位置(分别记为index1和index2),然后判断文件名长度,如果长度大于16,则从index1-16处截取输入字符串,作为键;如果长度小于等于16,则从index2+1处截取输入字符串,作为键。

2.代码实现

import java.util.LinkedHashMap;
import java.io.*;

public class Main{
    public static void main(String[] args) throws Exception{
        //标准输入
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        //新建map,文件名+空格+行号作为键,对应的数量作为值
        LinkedHashMap<String,Integer> map=new LinkedHashMap<>();
        //输入字符串
        String s;
        while((s=br.readLine())!=null){
            
            //最后一个空格出现的位置
            int index1=s.lastIndexOf(" ");
            //最后一个"\\"出现的位置
            int index2=s.lastIndexOf("\\");
            //构造文件名+空格+行号
            String strarr="";
            //如果大于16,则只取最后有效16个字符
            if(index1-index2>16){
                strarr=s.substring(index1-16);
            }
            //否则,从文件名第一个字符的位置开始截取
            else{
                strarr=s.substring(index2+1);
            }
            //构造键
            String key=strarr;
            //将对应数据放入map
            if(!map.containsKey(key)){
                map.put(key,1);
            }
            else{
                map.put(key,map.get(key)+1);
            }            
        }
        int n=map.size();
        for(String k:map.keySet()){
            //至多取最后8条记录
            if(n<=8){
                System.out.println(k+" "+map.get(k));
            }
            n--;
        }
    }
}

3.复杂度分析

  • 时间复杂度:假设错误记录的数量为n,需要遍历所有的错误记录,所以时间复杂度为O(n)O(n)
  • 空间复杂度:最坏情况下,需要额外大小为nn的map,所以空间复杂度为O(n)O(n)
xqxls的题解 文章被收录于专栏

牛客题解

全部评论

相关推荐

避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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