首页 > 试题广场 >

简单错误记录

[编程题]简单错误记录
  • 热度指数:84368 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径

数据范围:输入错误记录数量满足 ,每条记录的长度满足

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


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

输入

E:\V1R2\product\fpgadrive.c 1325

输出

fpgadrive.c 1325 1
推荐
L0L头像 L0L
//先将所有的字符串存入哈希表,key为字符串,value为<出现顺序,出现次数>,顺序取相同的字符串的最小值,次数一直累加
//排序的话,利用set重写比较器,按次数降序,次数相同则按出现顺序排列
//插入过程利用hash时间复杂度可以认为是O(n)
//排序过程set的是红黑树,可以认为是O(nlgn) ,总的复杂度就是这个了 
#include<iostream>
#include<unordered_map>
#include<set>
#include<string.h>
using namespace std;
struct info{//记录出现的顺序,和次数 
	int rank;
	int count;
	info(int rank,int count){
		this->rank=rank;
		this->count=count;
	}
};
struct fullinfo{//一条完整的结果,字符串和次数 
	string file;
	int rank;
	int count;
	fullinfo(string file,int rank,int count){
		this->file=file;
		this->rank=rank;
		this->count=count;
	}
};
struct classcomp {//set的比较器 
  bool operator()(const struct fullinfo& f1,const struct fullinfo& f2){
		if(f1.count==f2.count)
			return f1.rank<f2.rank;
		return f1.count>f2.count;
	}
};
typedef struct info INFO;
typedef struct fullinfo FULLINFO;
int main(){
	unordered_map<string,INFO> record;
	unordered_map<string,INFO>::iterator it;
	unordered_map<string,INFO>::const_iterator itfind;
	set<FULLINFO,classcomp> ret;
	set<FULLINFO,classcomp>::iterator sit;
	string linestr;//一行输入 
	string file;//文件名+行号 
	int pos;//空格的位置 
	int i=1;
	while(getline(cin,linestr)){
		if(linestr.length()==0)
			break;
		pos=linestr.rfind("\\");
		file=linestr.substr(pos+1);//拆分得到最后的filename和count 
		itfind=record.find(file);//在map中查看是否已经有了该字符串,没有则插入,有则次数加1 
		if(itfind==record.end()){
			INFO tmpi(i,1);
			record.insert(pair<string,INFO>(file,tmpi));
		}
		else{
			INFO tmpi(itfind->second.rank,itfind->second.count+1);
			record.erase(file);
			record.insert(pair<string,INFO>(file,tmpi));
		}
		i++;
	}
	for(it=record.begin();it!=record.end();it++){
		FULLINFO tmpfull(it->first,it->second.rank,it->second.count);//构建排序的set集合 
		ret.insert(tmpfull);
	}
	for(i=0,sit=ret.begin();sit!=ret.end()&&i<8;++sit,++i){//最多输出8条记录,file少于16位 
		if(file.find(" ")<=16){ 
			cout<<(*sit).file<<" "<<(*sit).count<<endl;
			} 
		else{
			cout<<(*sit).file.substr(file.find(" ")-16)<<" "<<(*sit).count<<endl;
		} 
		
	}
	return 0;
} 

编辑于 2015-11-14 14:14:24 回复(28)
b={}
while True:
    try:
        a=input().split('\\')
        name=a[-1]
        if name not in b:
            b[name]=1
        else:
            b[name]+=1
    except:
        break
ans=sorted(b.items(),key=lambda d:d[1],reverse=True)
for i in range(min(8,len(ans))):
    ans1=ans[i][0].split(' ')
    if len(ans1[0])>16:
        print(ans1[0][-16:]+' '+ans1[1]+' '+str(ans[i][1]))
    else:
        print(ans[i][0]+" "+str(ans[i][1]))

编辑于 2024-04-16 09:33:56 回复(0)
import collections
d = collections.defaultdict(int)
while True:
    try: d[input().split('\\')[-1]] += 1
    except: break
p = sorted(list(d.items()), key=lambda k: -k[1])
for i in range(min(len(p), 8)): 
    print(p[i][0].split()[0][-16:], p[i][0].split()[1], p[i][1])

发表于 2022-04-11 17:07:44 回复(0)
import sys

res = {}
for line in sys.stdin.readlines():
    path, line_number = [x for x in line.split()]
    file_name = path.split("\\")[-1]
    key = file_name + line_number
    if key in res:
        res[key][2] += 1
    else:
        temp = []
        if len(file_name) > 16:
            temp.append(str(file_name[-16:]))
        else:
            temp.append(file_name)
        temp.append(line_number)
        temp.append(1)
        res[key] = temp

out = []
for v in res.values():
    out.append(v)

out.sort(key=lambda ele: ele[2], reverse=True)

n = len(out) if len(out) <= 8 else 8
for i in range(n):
    print(out[i][0], out[i][1], out[i][2])


发表于 2021-03-02 14:26:39 回复(0)

啥也不会,就会傻瓜式的方法,先存储错误信息,以及同类错误信息的次数,这两个列表索引值对应。然后对错误信息的次数进行排序,并返回排序前的索引值,最后根据该索引值,从大到小索引对应的错误信息并打印,超过8个不打印。

errorMsg = []
errorNum = [0] * 99999  # 由于错误信息数目未知,因此初始化一个比较大的列表每种存错误信息的数量
while True:
    try:
        error = input().strip().split('\\')[-1] # 注意strip去掉每行末尾的空格或换行符
        if error not in errorMsg:
            errorMsg.append(error)
            errorNum[errorMsg.index(error)] = 1
        else:
            errorNum[errorMsg.index(error)] += 1
    except:
        break
errorNum = errorNum[:len(errorMsg)] # 跟据错误信息的种类,将errorNum列表末尾无用的0值去掉,便于排序
# print(errorNum, errorMsg)
# 该方法返回排序前(从大到小)的索引,以及排序好的列表
idx, _ = list(zip(*sorted(enumerate(errorNum), key=lambda x:x[1], reverse=True)))
msgCnt = 0 # 累计打印次数,最多打印8条信息
for i in idx:
    msgCnt += 1
    if len(errorMsg[i].split()[0]) > 16:
        msg = errorMsg[i].split()[0][-16:] + ' ' + errorMsg[i].split()[1] + ' ' + str(errorNum[i])
    else:
        msg = errorMsg[i] + ' ' + str(errorNum[i])
    if msgCnt > 8:
        break
    print(msg)
发表于 2020-08-18 20:40:54 回复(0)

-- coding: utf-8 -- # @Time : 2020/7/6 7:18 # @Author : Shajiu # @FileName: 2_Error_log.py # @Software: PyCharm # @Github :https://github.com/Shajiu ''' 题目: 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 处理: 1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并) 2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并) 3.输入的文件可能带路径,记录文件名称不能带路径 ''' import os from sys import stdin import codecs class Solution: def error_log(self):

    team = [] while True:
        line = stdin.readline().strip() if line == '': break  item = line.split(' ')
        item = [i for i in item]
        team.append(item) # F=codecs.open('F://新建文本文档.txt','r',encoding='utf-8')  # for v in F.readlines():  #     team.append(v.strip().split(' '))  # print(team)   array=[os.path.basename(v[0])+"_"+v[-1] for v in team]
    count={} for v in array: if v in count:
            count[v]+=1  else:
            count[v]=1  lstTuple  = sorted(count.items(), key=lambda d: d[1], reverse=True)
    ct=0  for key in lstTuple: if ct>7: break  ct+=1   f, r = str(key[0]).split('_') if f.index('.') >= 16: print(f[f.index('.')-16:],r,key[-1]) else: print(f, r, key[-1]) if __name__ == '__main__':
result=Solution()
result.error_log()
编辑于 2020-07-06 11:41:39 回复(0)
error_reconds = []
while True:
    try:
        route, row_num = [x for x in raw_input().split()]
        row_num = int(row_num)
        recond_tmp = []
        name = route.split("\\")[-1]
        name1 = name if len(name) < 16 else name[-16:]
        count = 1
        recond_tmp.append(name1)
        recond_tmp.append(row_num)
        recond_tmp.append(count)
        if len(name) > 16:
            recond_tmp.append(name)
        same_flag = False
        for recond in error_reconds:
            if recond[0] == recond_tmp[0] and recond[1] == recond_tmp[1]:
                if len(recond_tmp) == len(recond) == 4 and recond_tmp[3] != recond[3]:
                    same_flag = False
                else:
                    same_flag = True
                    recond[2] += 1
        if not same_flag:
            error_reconds.append(recond_tmp)

    except:
        error_reconds = sorted(error_reconds, key=lambda x:x[2], reverse=True)
        error_reconds = error_reconds if len(error_reconds) < 8 else error_reconds[:8]
        for recond in error_reconds:
            print recond[0], recond[1], recond[2]
        break

发表于 2020-04-12 23:24:57 回复(0)
pre_knowledge:
sorted(res.items(), key=lambda x: x[1], reverse=True)  
#可以对字典res的values进行排序

(10, 3) > (10, 2) > (9, 5)
(2956)# tuple的大小比较
完整代码:
res = {}
i = 0
while True:
    try:
        s = input()
        file_error = s.split('\\')[-1]
        found = False
        for key in res.keys():
            if file_error in key:
                res[key] = (res[key][0]+1, res[key][1]) # 数量+1
                found = True
        if not found:
            file_error_key = '{}'.format(file_error)
            res[file_error_key] = (1, 9999-i)  (2957)# 把数量和出现次数放入键值
            i += 1
    except:
        break
sort_res = sorted(res.items(), key=lambda x: x[1], reverse=True)
for i in range(min(8, len(sort_res))):
    name, num = sort_res[i]
    name = name.split(' ')
    file_name, error = ''.join(name[:-1]), name[-1]
    file_name = file_name[-16:]
    print('{} {} {}'.format(file_name, error, num[0]))



发表于 2020-03-19 13:19:49 回复(0)
import collections
import sys

def fun():
    record = collections.OrderedDict()
    # record={}
    while True:
        try:
            ## input_line=input().strip().split()
            input_line=sys.stdin.readline().strip().split()
            file_name=input_line[0].split('\\')[-1]
            key=str(file_name+(' ')+input_line[1])
            # print("key:",key)

            ## key=input().strip().split('\\')[-1]
            # key=sys.stdin.readline().strip().split('\\')[-1]
            # print("key:",key)

            # input_line=input().strip()
            # index =input_line.rfind('\\')
            # key=input_line[index+1:]
            # print("key:",key)

            if(key not in record):
                # record.update({key:1})
                record[key]=1
            else:
                record[key]+=1
        except:
            # print("error")
            break

    record_out = sorted(record.items(), key=lambda x: x[1], reverse=True)
    for k, v in record_out[:min(len(record_out),8)]:
        if (len(k) > 16):
            print(k[-16:], v)
        elif (len(k)<=16 and len(k)>0):
            print(k, v)

if __name__ == "__main__":
    fun()

一会儿运行30%,一会儿运行40%,我换了几种接收输入,还是一样。
发表于 2020-02-19 17:29:19 回复(0)
N=8
record_list=[]
while True:
    try:
        read_line = input().split()
        filename = read_line[0].split('\\')[-1][-16:]
        row = int(read_line[1])
        isin = False
        for i in range(len(record_list)):
            if [filename,row] == [record_list[i]['filename'],record_list[i]['row']]:
                record_list[i]['wrongtimes'] += 1
                isin = True
                break
        if isin == False:
            record_list.append({'filename':filename,'row':row,'wrongtimes':1})
    except:
        break
        
record_list = sorted(record_list, key=lambda e: e.__getitem__('wrongtimes'), reverse=True)

for i in range(min([N,len(record_list)])):
    print(record_list[i]['filename'],record_list[i]['row'],record_list[i]['wrongtimes'])
发表于 2020-02-11 21:52:32 回复(0)
Python 3.5+ 个人代码:

坑很多,我也写了很久才勉强写出来。
需要注意有很多要求,个人感觉难点就是双重排序
# 1. 将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,
#    如: fpgadrive.c 1325 1 
# 2. 结果根据数目从多到少排序
# 3. 数目相同的情况下,按照输入第一次出现顺序排序
# 4. 如果超过8条记录,则只输出前8条记录
# 5. 如果文件名的长度超过16个字符,则只输出后16个字符





# 目的是构建一个 wrong_dict = { ((filename, line): [number, rank]) }
wrong_dict = {} # 用字典要更好,可以轻松地计数
rank = 1   # 记录顺序的一个int型的数据

# 持续获得输入,若无数据输入,则先输出然后再退出循环
while 1:
    try:
        filename, line = (input().split('\\')[-1]).split()  # 先以反斜杠划分,再以空格划分
        if (filename, line) in wrong_dict:  # 有就让这个键的值中的记录出现次数的值+1
            wrong_dict[(filename, line)][0] += 1
        else:   # 没有就新建一个键值对,并且需要注意让记录顺序的数据加1
            wrong_dict[(filename, line)] = [1, rank]
            rank += 1
    except:
        # 先排number,number降序;(number相同的情况下)再排rank,rank增序
        # 并且只取8个数据或者不到8个数据
        result_list = sorted(wrong_dict.items(), key = lambda x: (-x[1][0], x[1][1]))[: 8]
        # 最后按照要求打印:
        for ((filename, line), [number, rank]) in result_list:
            print(filename[-16: ], line, number)
        # 退出循环
        break


发表于 2020-02-11 12:17:40 回复(6)
#r存储错误的记录,n存储记录的次数
r=[]
n=[]
try:
    while True:
        s=input()
        i=s.rfind('\\')
        if s[i+1:] in r:
            j=r.index(s[i+1:])
            n[j]+=1
        else:
            r.append(s[i+1:])
            n.append(1)
except:
    pass
i=0
q=len(r)
while i<min(8,q):
    j=n.index(max(n))
    t=r[j].split()
    print(t[0][-16:],t[1],n[j])
    r.pop(j)
    n.pop(j)
    i+=1
发表于 2019-10-18 00:00:26 回复(0)
#做了很久,最后用有序字典才AC,一般字典过不了“稳定排序”

import sys
import collections

while True:

    temp = []
    while True:
        lis = sys.stdin.readline().strip('\n')
        if not lis:
            break
        temp.append(lis)
    if not temp:
        break

    res = collections.OrderedDict()
    for i in range(len(temp)):
        name = temp[i].split('\\')[-1]
        if name not in res:
            res[name] = 1
        else:
            res[name] += 1

    # 稳定排序才能AC
    res = sorted(res.items(), key=lambda item: item[1], reverse=-1)
    if len(res) > 8:
        r = 8
    else:
        r = len(res)

    for i in range(r):
        file = res[i][0].split()
        if len(file[0]) > 16:
            file[0] = file[0][-16:]
        print('{0} {1} {2}'.format(file[0], file[1], res[i][1]))

发表于 2019-04-02 16:35:54 回复(0)
import collections
d = collections.OrderedDict()
while True:
    try:
        ele = input().split('\\')[-1].strip('\n')
        if not ele:
            break
        if ele in d:
            d[ele] += 1
        else:
            d[ele] = 1
    except:
        break
d = sorted(d.items(), key=lambda k: k[1], reverse=True)
for i in range(min(len(d), 8)):
    t = d[i][0].split(' ')
    print(t[0][-16:], t[1], d[i][1])
发表于 2018-08-21 18:27:31 回复(0)
import collections

if __name__ == '__main__':
    lst = []
    dct = collections.OrderedDict()#创建有序字典
    while True:
        try:
            tmp = input().split('\\')[-1].strip()
            if not tmp:
                break
            if tmp not in lst:
                lst.append(tmp)
            if tmp in dct:
                dct[tmp] += 1
            else:
                dct[tmp] = 1
        except:
            break
    dctLast = sorted(dct.items(),key = lambda d:d[1],reverse = True)
    count = 0
    for key in dctLast:
        if count > 7:
            break
        count += 1
        if len(key[0].split(' ')[0]) > 16:
            print(key[0].split(' ')[0][-16:],key[0].split(' ')[1],key[1])
        else:
            print(key[0].split(' ')[0], key[0].split(' ')[1], key[1])
发表于 2018-08-21 15:54:08 回复(0)
import sys
record,d=[],[]
for line in sys.stdin:#循环读取输入
    error=line.split('\\')[-1].strip()#获取最后一个\右边的字符
    if error not in d:#该文件名和代码行数未出现过,则添加进记录,并计数为1
        d.append(error)
        record.append([error,1])
    else:#已出现过,则计数+1
        index=d.index(error)
        record[index][1]+=1
record=sorted(record,key=lambda x:x[1],reverse=True)#按次数倒序排序
if len(record)>8:#只取前8条记录
    record=record[:8]
for x in record:
    l=len(x[0].split()[0])
    if l>16:#文件名超过16个字符,则取后16个字符
        x[0]=x[0][l-16:]
    print(x[0]+' '+str(x[1]))

发表于 2018-07-14 14:42:00 回复(0)
import sys
input_records = []
for line in sys.stdin:
    input_records.append(line.strip('\n'))
records = {}
for i in range(len(input_records)):
    error = input_records[i].split('\\')[-1] 
    if not error in records.keys():
        records[error] = [1,-i]
    elif error in records.keys():
        records[error][0] += 1
    else:
        continue
#print(records)
sorted_record = sorted(records.items(),key=lambda item:item[1],reverse=True)
#print(out)
out = ''
tag = 0
#print(sorted_record)
for r in sorted_record:
    if tag >= 8:
        break
    file_name = r[0].split(' ')[0]
    line_num = r[0].split(' ')[1]
    if len(file_name) > 16:
        file_name = file_name[-16:]
        #r[0] = file_name + ' ' + line_nume
    re = file_name + ' ' + line_num + ' ' + str(r[1][0])
    print(re)
    #out += re
    tag += 1
#print(out)



编辑于 2017-07-27 20:33:24 回复(1)
#coding=utf-8
import sys

d={}
while True:
    f=sys.stdin.readline().strip()
    if not f:
        break
    ff=f.split('\\')[-1]
    if ff not in d.keys():
        d[ff]=1
    else:
        d[ff]+=1
for i in range(min(len(d.values()),8)):
    m=max(d.values())
    for j in d:
        if d[j]==m:
            if len(j.split()[0])>16:
                j1=j.split()
                print '{0} {1} {2}'.format(j1[0][-16:],j1[1],m)
            else:
                print '{0} {1}'.format(j,m)
            d[j]=0
            break
请大佬看看为什么错了

发表于 2017-07-08 11:53:45 回复(0)
import sys
d=dict()
for i,line in enumerate (sys.stdin):
    name,count = line.split()
    key=name.split("\\")[-1]+"#"+count
    d.setdefault(key,0+0.0000001*(100000-i));
    d[key]+=1
top10=sorted(d.items(),key= lambda x:x[1],reverse=True)[:8]
for k,v in top10:
name,count=k.split("#")
print name[-16:]+ " "+ count +" "+str(int(v))
你们真的不喜欢精简的代码吗?
发表于 2016-09-27 09:56:07 回复(2)
from collections import OrderedDict
def solution(lines):
    records = OrderedDict()  # 有序字典,便于后期稳定输出
    
    for e in lines:
        line = e.split()
        name = line[0].split('\\')[-1]
        if (name, line[1]) not in records:records[(name, line[1])] = 1
        else:records[(name, line[1])] += 1
    return records
    

import sys

try:
    while True:
        lines = sys.stdin.readlines()
        # print lines
        if not lines:
            break
        ret = solution(lines)
        # print ret
        #result = zip(ret.keys(), ret.values())
        result = sorted(ret.iteritems(),key=lambda x:x[1], reverse=True) # 本身按递增排序的结果就是不稳定的,reverse之后就满足了。。
        # print result
        # print result[:8]
        
        for e in result[:8]:
            if len(e[0][0]) > 16:print e[0][0][-16:],e[0][1],e[1]
            else: print e[0][0],e[0][1],e[1]
            
        
except:
    # print result
    pass

发表于 2016-08-21 00:26:30 回复(0)