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

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

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


输出描述:
将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1 
结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
如果超过8条记录,则只输出前8条记录.
如果文件名的长度超过16个字符,则只输出后16个字符

 

输入例子:
E:\V1R2\product\fpgadrive.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 }

 


posted @ 2016-04-04 17:40  crazybuddy  阅读(543)  评论(0编辑  收藏  举报