• 华为2016校园招聘上机笔试题[编程题] 简单错误记录


    开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
    处理:
    1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
    2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
    3.输入的文件可能带路径,记录文件名称不能带路径

    输入描述:
    一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
    文件路径为windows格式
    如:E:V1R2productfpgadrive.c 1325


    输出描述:
    将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1 
    结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
    如果超过8条记录,则只输出前8条记录.
    如果文件名的长度超过16个字符,则只输出后16个字符
    输入例子:
    E:V1R2productfpgadrive.c 1325
    
    输出例子:
    fpgadrive.c 1325 1
    
    先贴我的代码,不过无法AC,显示“运行错误:请检查是否存在数组越界非法访问,野指针乱访问,空指针乱访问等情况”,eclipse可以运行,具体还没找到原因,可能代码较为混乱吧
     1 package com.zbt.temp;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 import java.util.LinkedHashMap;
     6 import java.util.List;
     7 import java.util.Map;
     8 import java.util.Scanner;
     9 import java.util.Set;
    10 
    11 public class CopyOfhuawei2016 {
    12 
    13     public static void main(String[] args) {
    14         Map<String, String> m = new LinkedHashMap<String, String>();
    15         Scanner sc = new Scanner(System.in);
    16         while (sc.hasNextLine()) {
    17             String s = sc.nextLine();
    18             String fn = fullNameLine(s);
    19             String pn = partNameLine(s);
    20             Set<String> se = m.keySet();
    21             Iterator<String> it = se.iterator();
    22 
    23             if (!se.isEmpty()) {
    24                 int flag = 0;
    25                 while (it.hasNext()) {
    26                     String tem1 = it.next();
    27                     String tem2 = fullNameLine(tem1);
    28 
    29                     if (fn.equals(tem2)) {// 如果文件全名和行号都相等
    30                         String[] tem3 = m.get(s).split(" ");
    31                         int i = Integer.valueOf(tem3[tem3.length - 1]);// 找到记录次数
    32                         m.put(s, pn + " " + (++i));
    33                     } else
    34                         flag++;
    35                     if (flag == se.size()) {
    36                         m.put(s, pn + " " + 1);
    37                     }
    38                 }
    39 
    40             } else {
    41                 m.put(s, pn + " " + 1);
    42             }
    43         }
    44         sc.close();
    45         List<String> li = new ArrayList<String>();
    46         Set set = m.keySet();
    47         Iterator<String> it = set.iterator();
    48         while (it.hasNext()) {
    49             li.add(m.get(it.next()));
    50         }
    51         for (int i = 0; i < li.size(); i++) {
    52             for (int j = li.size() - 2; j >= i; j--) {
    53                 int n1 = convert(li.get(j));
    54                 int n2 = convert(li.get(j + 1));
    55                 if (n1 < n2) {
    56                     String temp = li.get(j);
    57                     li.set(j, li.get(j + 1));// li.get(j)=li.get(j+1);这是错误的写法,对象无法复制给对象,下同
    58                     li.set(j + 1, temp);// li.get(j+1)=temp;
    59                 }
    60             }
    61 
    62         }
    63 
    64         if (li.size() > 8) {
    65             for (int i = 0; i < 8; i++) {
    66                 System.out.println(li.get(i));
    67             }
    68         } else {
    69             for (int i = 0; i < li.size(); i++) {
    70                 System.out.println(li.get(i));
    71             }
    72         }
    73     }
    74 
    75     public static String fullNameLine(String s) {
    76         String[] str = s.split("\\");
    77         String str1 = str[str.length - 1];// 获得文件名与行数
    78         return str1;
    79     }
    80 
    81     public static String partNameLine(String s) {
    82         String[] str = s.split("\\");
    83         String[] str1 = str[str.length - 1].split(" ");// 把行数与文件名分开
    84         String s1 = null;
    85         if (str1[0].length() > 16) {// 如果文件名大于16字符
    86             s1 = str1[0].substring(str1[0].length() - 16, str1[0].length());// 求出文件名大于16字符的截断文件名
    87         } else {
    88             s1 = str1[0];
    89         }
    90         return (s1 + " " + str1[1]);
    91     }
    92 
    93     public static int convert(String s) {//获得出现次数
    94         String ls = String.valueOf(s.charAt(s.length() - 1));
    95         int jj = Integer.valueOf(ls);
    96         return jj;
    97     }
    98 
    99 }

    看到一个网友代码,思路比较清晰,想法比较一致,可以AC,贴上来

     1 package test.huawei.com;
     2  
     3 import java.util.ArrayList;
     4 import java.util.Collections;
     5 import java.util.Comparator;
     6 import java.util.LinkedHashMap;
     7 import java.util.List;
     8 import java.util.Map;
     9 import java.util.Map.Entry;
    10 import java.util.Scanner;
    11  
    12 /**
    13  * @author jelly
    14  *
    15  */
    16 public class FileErrorLog {
    17  
    18     /**
    19      * @param args
    20      */
    21     public static void main(String[] args) {
    22         Map<String, Integer> result = new LinkedHashMap<>();
    23         Scanner scanner = new Scanner(System.in);
    24         while (scanner.hasNext()) {
    25             String log = scanner.nextLine();
    26             String file = log.substring(log.lastIndexOf("\") + 1);
    27             if (result.containsKey(file)) {
    28                 result.put(file, result.get(file).intValue() + 1);
    29             } else {
    30                 result.put(file, 1);
    31             }
    32         }
    33         scanner.close();
    34          
    35         List<Map.Entry<String, Integer>> resultList = new ArrayList<>(result.entrySet());
    36         // 排序
    37         Collections.sort(resultList, new Comparator<Map.Entry<String, Integer>>() {
    38  
    39             @Override
    40             //按照value从大到小排序
    41             public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
    42                 if (o1.getValue() > o2.getValue()) {
    43                     return -1;
    44                 }else if (o1.getValue() < o2.getValue()) {
    45                     return 1;
    46                 }
    47                 return 0;
    48             }
    49         });
    50  
    51         List<String> ret = new ArrayList<>();
    52         int count = 0;
    53         for(Entry<String, Integer> log: resultList){
    54             if (count < 8) {
    55                 String fileName = log.getKey().split(" ")[0];
    56                 if (fileName.length() > 16) {
    57                     ret.add(fileName.substring(fileName.length() - 16) + " " + log.getKey().split(" ")[1] + " "
    58                             + log.getValue());
    59                 } else {
    60                     ret.add(log.getKey() + " " + log.getValue());
    61                 }
    62             }
    63             count++;
    64              
    65         }
    66         for(String s: ret){
    67             System.out.println(s);
    68         }
    69     }
    70  
    71 }
    
    
  • 相关阅读:
    BZOJ3514:GERALD07加强版(LCT,主席树)
    BZOJ2729:[HNOI2012]排队(组合数学)
    BZOJ4517:[SDOI2016]排列计数(组合数学,错排公式)
    BZOJ3123:[SDOI2013]森林(主席树,启发式合并)
    BZOJ3786:星系探索(Splay,括号序)
    BZOJ2212:[POI2011]Tree Rotations(线段树合并)
    BZOJ5329:[SDOI2018]战略游戏(圆方树,虚树)
    CF613D:Kingdom and its Cities(树形DP,虚树)
    BZOJ3611:[HEOI2014]大工程(树形DP,虚树)
    BZOJ2286:[SDOI2011]消耗战(树形DP,虚树)
  • 原文地址:https://www.cnblogs.com/crazybuddy/p/5352443.html
Copyright © 2020-2023  润新知