首页 > 试题广场 >

简单错误记录

[编程题]简单错误记录
  • 热度指数:339061 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。


处理:


1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是相同的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准

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

输入描述:

每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。



输出描述:

将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:

示例1

输入

D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645
E:\je\rzuwnjvnuz 633
C:\km\tgjwpb\gy\atl 637
F:\weioj\hadd\connsh\rwyfvzsopsuiqjnr 647
E:\ns\mfwj\wqkoki\eez 648
D:\cfmwafhhgeyawnool 649
E:\czt\opwip\osnll\c 637
G:\nt\f 633
F:\fop\ywzqaop 631
F:\yay\jc\ywzqaop 631
D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645

输出

rzuwnjvnuz 633 1
atl 637 1
rwyfvzsopsuiqjnr 647 1
eez 648 1
fmwafhhgeyawnool 649 1
c 637 1
f 633 1
ywzqaop 631 2

说明

由于D:\cfmwafhhgeyawnool 649的文件名长度超过了16个字符,达到了17,所以第一个字符'c'应该被忽略。
记录F:\fop\ywzqaop 631和F:\yay\jc\ywzqaop 631由于文件名和行号相同,因此被视为同一个错误记录,哪怕它们的路径是不同的。
由于循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准,所以D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645不会被记录。  
nv=[]#初始全纪录list
check=[]#初始去除重复list
while True:
    try:
        word,n = input().split()#处理数据,先以空格区分
        word = word.split("\\")#再以\区分
        word = word[-1]#提取最后一项
        if len(word) > 16:#规范为最大十六位
            word = word[(len(word) - 16)::]#只要最后十六位
        str1 = word + " " + n#由于要求行数和后缀完全匹配才算,直接重新合并判断这一整条就好了不用分开
        nv.append(str1)#输入list里全纪录
        if str1 not in check:#模拟set功能,由于set会乱序在这不能用
            check.append(str1)#当为新的时候添加
    except:
        break
if len(check) > 8:#当错误记录大于8项时(去除重复),只用最后八项设n=8
    n=8
else:
    n=len(check)#小于8项时
for i in range (n):
    str2 = check[(len(check)-n+i)] + " " + str(nv.count(check[(len(check)-n+i)]))#由于可能小于八项无法直接-8+i起始,换成(总长度-n+i)逐个提取
    print(str2)

发表于 2021-07-05 13:07:38 回复(0)
b={}
while True:
    try:
        p=input()
        if not p:
            break
        a=p.split('\\')
        n=a[-1].split(' ')
        if len(n[0])<=16:
            x=a[-1]
        else:
            x = n[0][-16:] + ' ' + n[-1]
        if x not in b:
            b[x]=1
        else:
            b[x]+=1
    except:
        break
if len(b.keys())<=8:
    for key in b.keys():
        print(key,b[key])
else:
    c=[]
    for key in b.keys():
        c.append(key)
    for i in c[-8:]:
        print(i,b[i])



# 一開始沒看清題,以為是按最後一次出現的算,刪掉可惜了,就注釋掉放在後邊了
# b={}
# while True:
#     try:
#         p=input()
#         if not p:
#             break
#         a=p.split('\\')
#         n=a[-1].split(' ')
#         if len(n[0])<=16:
#             x=a[-1]
#         else:
#             x = n[0][-16:] + ' ' + n[-1]
#         if x not in b:
#             b[x]=1
#         else:
#             e=b[x]
#             b.pop(x)
#             b[x]=e+1
#     except:
#         break
# if len(b.keys())<=8:
#     for key in b.keys():
#         print(key,b[key])
# else:
#     c=[]
#     for key in b.keys():
#         c.append(key)
#     for i in c[-8:]:
#         print(i,b[i])



发表于 2021-06-30 03:53:24 回复(1)
fn_list = []
ln_list = []
cn_list = []
while True:
    try:
        str1 = input().split(' ')
        fn = str1[0].split("\\")[-1]
        if len(fn) > 16:
            fn = fn[-16:]
        ln = int(str1[1])
        flag = True
        for i in range(len(fn_list)):
            if fn_list[i] == fn and ln_list[i] == ln:
                cn_list[i] += 1
                flag = False
        if flag:
            fn_list.append(fn)
            ln_list.append(ln)
            cn_list.append(1)
    except:
        break
if len(fn_list) >= 8:
    for i in range(len(fn_list)-8, len(fn_list)):
        print(fn_list[i],end=' ')
        print(ln_list[i],end=' ')
        print(cn_list[i])
else:
    for i in range(len(fn_list)):
        print(fn_list[i],end=' ')
        print(ln_list[i],end=' ')
        print(cn_list[i])

发表于 2021-06-16 21:47:34 回复(0)
我这个哪里有问题吗?部分用例不通过
import collections
d=collections.OrderedDict()
while True:
    try:
        lin=input().split("\\")[-1]
        d[lin]=d.get(lin,0)+1
    except:
        break
lst=list(zip(d.keys(),d.values()))
for i in lst[-8:]:
    print(i[0],i[1])
d={}
发表于 2021-05-06 21:46:07 回复(0)

终于解决了,看了评论区的回答才明白,题意的循环记录太坑了。

#-*-coding:utf-8-*-
 import sys
table = {}
name = []
for line in sys.stdin:
    path, num = line.split()
    path = path.split("\\")[-1]
    key = path[-16:] + ' ' + num            # 文件名 + 代码行数相同才算"相同"的错误记录。
    if key not in name:
        if key not in table.keys():            # 题意中未阐述清楚的循环记录。若后面出现的会更新第一次出现的时间,此判断注释即可。
            if len(name) == 8:            # name表中只记录8条错误记录
                name.pop(0)
            name.append(key)
            table[key] = 1
        else:            # 已经出现过的记录的值 +1 。因为不输出,不加也不影响check
            table[key] += 1
    else:            # 正常情况计数
        table[key] += 1
# for i, j in zip(range(len(name)), table.keys()):
for i in range(len(name)):
    print(name[i] + ' ' + str(table[name[i]]))
编辑于 2021-04-13 10:55:03 回复(0)
records = []
while True:
    try:
        records.append(input().split())
    except EOFError:
        break
backslash = 0
for i in range(len(records)):
    backslash = records[i][0][::-1].index("\\")
    records[i][0] = records[i][0][max(-backslash, -16):]
counts = {}
j = len(records) - 1
while j >= 0:
    if str(records[j]) not in counts:
        counts[str(records[j])] = 1
    else:
        counts[str(records[j])] += 1
    j -= 1
ordered = []
for k in range(len(records)):
    if records[k] not in ordered:
        ordered.append(records[k])
ordered = ordered[-8:]
for n in range(len(ordered)):
    print(ordered[n][0], ordered[n][1], counts[str(ordered[n])])

发表于 2021-03-29 17:18:19 回复(0)
import sys

test_data = [d.strip() for d in sys.stdin.readlines()]

ret_dict = dict()
key_list = []

for d in test_data:
    temp_list = d.split()
    path = temp_list[0].split("\\")[-1][-16:]
    line_num = temp_list[1]
    key = (path, line_num)
    if key not in ret_dict:
        ret_dict[key] = 1
        key_list.append(key)
    else:
        ret_dict[key] += 1

for key in key_list[-8:]:
    print(key[0], key[1], ret_dict[key], sep=" ")
发表于 2021-03-21 13:31:52 回复(0)
mylist=[]
while True :
    try :
        s=input()
        p,n=s.split(" ")
        name=p.split("\\")[-1]
        if len(name) > 16 : name = name[-16:]
        control = True
        for i in mylist :
            if name == i[0] and n == i[1] : 
                i[2] += 1
                control = False
        if control : mylist.append([name,n,1])
    except :
        break
for i in mylist[-8:] :
    print("%s %s %d"%(i[0],i[1],i[2]))

发表于 2021-02-20 11:06:55 回复(0)
28行python实现,来来回回使用字典元组列表序列
import sys
def output(list1):
    for tup in list1:
        str=tup[0].split(' ')
        print(str[0][-16:],str[1],tup[1])
a={}
b=list()
while True:
    str=sys.stdin.readline().strip()
    if str=='':
        break
    str=str.split('\\')[-1]
    if str in b:
        a[str]+=1
    else:
        b.append(str)
        a[str]=1
list1=list(a.items())
if len(list1)<=8:
    output(list1)
else:
    n=-8
    tup=()
    while n<=-1:
        tup=list1[n]
        str=tup[0].split(' ')
        print(str[0][-16:],str[1],tup[1])
        n+=1

发表于 2021-02-17 00:27:59 回复(0)
本地编译器字符串切割一直都不对劲儿。脑子都大了。
在线编译就是对的。
发表于 2021-01-13 02:22:54 回复(0)
题目讲解不清,计数器不清零, Python简单实现


import sys

q = []
d = {}

def add_queue(key):
    if key in d:
        d[key] += 1
    else:
        d[key] = 1
        q.append(key)
        if len(q) > 8:
            # removed = q[0]
            q.pop(0)
            # d.pop(removed)
    
def format_key(k):
    if len(k) > 16:
        return k[-16:]
    return k
    
for line in sys.stdin:
    log = line
    if log == "":
        break
    s1, num = log.split("\\")[-1][:-1].split(" ")
    s1 = format_key(s1) + " " + num
    add_queue(s1)

    
for k in q:
    print(k, d[k])


发表于 2020-12-20 05:27:03 回复(0)
使用 OrderedDict 来存储
import sys
import re
from collections import OrderedDict


d = OrderedDict()
for s in sys.stdin:
    name, num = s.split()
    f_name = re.search(r"\\([\w\.]+)$", name).group(1)
    c = d.get((f_name, num), 0)
    d[(f_name, num)] = c+1

for key, value in list(d.items())[-8:]:
    f_name, num = key
    print(f_name[-16:], num, value)


发表于 2020-12-13 17:46:15 回复(0)
  我看很多所谓通过的代码不会将后面录入的重复错误信息存储(记录其位置),只是在错误数上加1,这样根本不对吧,那么这样实际上只是记录了不重复的错误记录。下图是我随意找了条所谓的通过代码做的截图说明。

编辑于 2020-11-02 21:49:03 回复(0)
如果是循环记录,那么应该是再次出现相同的错误的时候删除旧记录,在最后追加新纪录:
# -*- coding: utf-8 -*-
"""
@author: obaby
@license: (C) Copyright 2013-2020, obaby@mars.
@contact: root@obaby.org.cn
@link: http://www.obaby.org.cn
        http://www.h4ck.org.cn
        http://www.findu.co
@file: error_recoder.py
@time: 2020/10/12 9:01
@desc:
"""
log_list = []
count_dict = {}
while True:
    try:
        line = input()
        file_path = line.split(' ')[0]
        line_number = line.split(' ')[-1]
        file_name = file_path.split('\\')[-1][-16:]
        key = file_name + ' ' + line_number
        if key in count_dict.keys():
            count_dict[key] += 1
        else:
            count_dict[key] =1
        if key in log_list:
            list.remove(key)
        if len(log_list) >=8:
            log_list.pop(0)
        log_list.append(key)

    except:
        break

for l in log_list:
    print(l +' '+ str(count_dict[l]))
但是,这样的话会失败,实际上是不要删除旧记录,更新之前的记录:
# -*- coding: utf-8 -*-
"""
@author: obaby
@license: (C) Copyright 2013-2020, obaby@mars.
@contact: root@obaby.org.cn
@link: http://www.obaby.org.cn
        http://www.h4ck.org.cn
        http://www.findu.co
@file: error_recoder.py
@time: 2020/10/12 9:01
@desc:
"""
log_list = []
count_dict = {}
while True:
    try:
        line = input()
        if not line:
            break
        file_path = line.split(' ')[0]
        line_number = line.split(' ')[-1]
        file_name = file_path.split('\\')[-1][-16:]
        key = file_name + ' ' + line_number
        if key in count_dict.keys():
            count_dict[key] += 1
        else:
            count_dict[key] =1
        if key not in log_list:
            log_list.append(key)

    except:
        break

for l in log_list[-8:]:
    print(l +' '+ str(count_dict[l]))

发表于 2020-10-12 09:47:02 回复(0)
import sys
from collections import defaultdict
lines = sys.stdin.readlines()
err = []
dt = defaultdict(int)
for i in lines:
    path, line_num = i.split()
    file_name = path.split('\\')[-1]
    if len(file_name) > 16:
        file_name = file_name[-16:]
    message = file_name + ' ' + line_num
    dt[message] += 1
    if message not in err:
        err.append(message)

if len(err) > 8:
    err = err[-8:]

for i in err:
    print('{} {}'.format(i, dt[i]))
发表于 2020-09-25 21:20:03 回复(0)
import heapq
# 创建数据对象
class Record(object):
    def __init__(self,file,row,occur):
        self.file = file
        self.row = row
        self.occur = occur
        self.count = 1
    def __eq__(self, o):
        return self.file == o.file and self.row == o.row 
    
    def __lt__(self,o):
        return self.occur < o.occur
        
# 数据输入
recodings = []
occur = 0
while True:
    try:
        data = input().split()
        file,row = data[0].split("\\")[-1][-16:],data[1]
        recodings.append(Record(file, row, occur))
        occur += 1
    except:
        break
# 存放数据
error_log = []
for i in recodings:
    if i not in error_log:
        heapq.heappush(error_log, i)
    else:
        idx = error_log.index(i)
        error_log[idx].count += 1
        error_log[idx].occur = i.occur
    # 超过8个删除最远访问的
    while len(error_log) > 8:
        heapq.heappop(error_log)
# 按访问顺序从远到近打印
while error_log:
    record = heapq.heappop(error_log)
    print(record.file,record.row,record.count)

结果集是对的,按照访问由远到近顺序打印,打不出测试用例要求的输出顺序
发表于 2020-09-13 14:29:28 回复(0)
这题表述有问题,准确理解是只输出最后8条记录就行(所有记录都保存)。我按时刻只保存8条记录的结果则不对(如下),但是按只输出最后8条结果就一样了。
系统给出例子
G:\rp\onajqj\maahmq 631
E:\njfgjkcrh 641
C:\co\zk\ao\bxgxjfgrwckfxekeqro 629
D:\mf\si\jmfdahkeffyjjsf 646
E:\wn\arefkiz 633
C:\gpjleb\cinhhx\zjydgr\njfgjkcrh 640
E:\nwrrhx\qyw\bxgxjfgrwckfxekeqro 636
G:\usgsl\ywr\tve\cqekvaxypemktyurn 647
C:\jftbig\arefkiz 650
F:\rgk\cai\arefkiz 640
D:\tvse\vs\dhzrmy\njfgjkcrh 634
E:\coba\qbs\xagq\njfgjkcrh 628
F:\wnfsmf\oxrvbv\njfgjkcrh 632
C:\khqx\nv\jmfdahkeffyjjsf 637
F:\hm\ra\uaxckn\bxgxjfgrwckfxekeqro 647
D:\soq\jmfdahkeffyjjsf 642
F:\moxnw\szxcdhlaytgj 639
E:\avcop\jd\vwtrt\njfgjkcrh 650
E:\hou\vv\szxcdhlaytgj 631
C:\uozkwd\bxgxjfgrwckfxekeqro 650
F:\jmfdahkeffyjjsf 650
E:\hgoxms\nwax\szxcdhlaytgj 633
F:\vylww\zhh\cqekvaxypemktyurn 643
C:\njfgjkcrh 637
F:\bfn\dxwjje\jmfdahkeffyjjsf 632
E:\bxgxjfgrwckfxekeqro 634
G:\gwuusj\ized\qq\szxcdhlaytgj 646
F:\arefkiz 644
G:\zsw\uewu\arefkiz 634
E:\ja\zg\njfgjkcrh 644
D:\gfute\ju\wuy\szxcdhlaytgj 636
C:\mpgcx\kcgi\arefkiz 645
C:\zayn\jmfdahkeffyjjsf 648
F:\kkplu\avvw\hbzmwj\jmfdahkeffyjjsf 648
E:\maahmq 631
E:\hs\xnto\jmfdahkeffyjjsf 645
G:\cqekvaxypemktyurn 633
D:\maahmq 646
E:\jmfdahkeffyjjsf 636
G:\hbvm\szxcdhlaytgj 642
系统答案
szxcdhlaytgj 636 1
arefkiz 645 1
jmfdahkeffyjjsf 648 2
jmfdahkeffyjjsf 645 1
qekvaxypemktyurn 633 1
maahmq 646 1
jmfdahkeffyjjsf 636 1
szxcdhlaytgj 642 1
我的程序答案(时刻只保存8条记录):
arefkiz 645 1
jmfdahkeffyjjsf 648 2
maahmq 631 1b
jmfdahkeffyjjsf 645 1
qekvaxypemktyurn 633 1
maahmq 646 1
jmfdahkeffyjjsf 636 1
szxcdhlaytgj 642 1
这是仔细观察发现系统用例中倒数第6行系统没算进去,必然是只输出最后8条记录。更改为正确的理解后,答案与系统一致。
编辑于 2020-09-13 09:52:45 回复(0)
#只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
#最后出现的八条‘错误记录’!!!!!不是最后八条记录
fpath={}
res=[]
while True:
    try:
        new=input().split(' ')
        path= new[0].split('\\')[-1]
        if len(path)>16:
            path=path[-16:]
        k = path + ' ' + new[1]
        if k in fpath:
            fpath[k]+=1 
        else:
            fpath[k]=1
            res.append(k)
    except:
        break
for i in res[-8:]:#8个新错误
    print(i,fpath[i])

编辑于 2020-09-09 15:59:41 回复(0)
r1,r2 = [],[]
while True:
    try:
        log = input().split()
        file = log[0].split('\\')[-1]
        if len(file) > 16: file = file[-16:]
        if file + ' ' + log[1] in r1:
            r2[r1.index(file + ' ' + log[1])] += 1
        else:
            r1.append(file + ' ' + log[1])
            r2.append(1)
    except:
        break
for i ,j in zip(r1[-8:],r2[-8:]):
    print(i + ' ' + str(j))
这个循环的表达有点不明确,实际上是全部记录,重复记录加一,取最后8条数据。而不是只保存8条数据,后来则最前面的被顶掉。其他的没啥坑。
对了,这里要求顺序,使用dict可能会有点问题。
发表于 2020-09-02 16:14:31 回复(0)

问题信息

难度:
55条回答 66143浏览

热门推荐

通过挑战的用户

查看代码