首页 > 试题广场 >

简单错误记录

[编程题]简单错误记录
  • 热度指数:362296 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}在本题中,我们需要处理文件报错信息,其由出错文件的文件路径和错误行号组成。

\hspace{15pt}文件路径的前三个字母为大写字母 \texttt{A-Z} 、冒号 \texttt{ 和反斜杠 \texttt{ ,代表盘符;随后是若干由小写字母构成的字符串,代表文件夹名,彼此使用单个反斜杠间隔。路径的最后一个反斜杠后是文件名。
\hspace{15pt}我们只在乎文件名(即去掉除了文件名以外的全部信息),且至多保留文件名的最后 16 个字符。

\hspace{15pt}随后,我们需要统计相同的报错信息:
\hspace{23pt}\bullet\,如果两条报错信息保留后 16 个字符后的文件名相同,且行号相同,则视为同一个报错;

\hspace{15pt}相同的报错信息以第一次出现的时间为准,至多输出最后 8 条记录。

输入描述:
\hspace{15pt}本题将会给出 1 \leqq T \leqq 100 条报错信息,确切数字未知,您需要一直读入直到文件结尾;您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每条报错信息描述如下:

\hspace{15pt}在一行上先输入一个长度为 1 \leqq {\rm length}(x) \leqq 100 的字符串 x 代表文件路径;随后,在同一行输入一个整数 y \left( 1 \leqq y \leqq 1000 \right) 代表行号。
\hspace{15pt}文件路径的格式如题干所述,保证文件名不为空。


输出描述:
\hspace{15pt}至多八行,每行先输出一个长度为 1 \leqq {\rm length}(s) \leqq 16 的字符串 s ,代表文件名;随后,在同一行输出错误行号、报错次数。
示例1

输入

D:\oblemsinnowcoder 12
D:\nowcoderproblemsinnowcoder 12
D:\nowcoder\problemsinnowcoder 13
D:\oj\problemsinnowcoder 13

输出

oblemsinnowcoder 12 2
oblemsinnowcoder 13 2

说明

\hspace{15pt}在这个样例中,这四条报错信息去除文件路径后,由于文件名长度均超过 16 个字符,故我们只保留最后 16 个字符,得到的文件名均为 \texttt{ 。所以,我们将它们看作同一个文件,按照报错行号划分即可。
示例2

输入

A:\aa 1
B:\b 1
C:\c 1
D:\d 1
E:\e 1
F:\f 1
G:\g 1
H:\h 1
I:\i 1
A:\aa 1

输出

b 1 1
c 1 1
d 1 1
e 1 1
f 1 1
g 1 1
h 1 1
i 1 1

说明

\hspace{15pt}在这个样例中,第一、十条报错信息完全相同,但是我们以其第一次出现的顺序为准,在输出最后 8 条记录时,不包含这一报错。
示例3

输入

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 = {}
while 1:
    try:
        x,y = input().split(' ')
        x1 = x.split('\\')[-1][-16:]
        key = x1 +' '+ y
        d[key]= d.get(key,0) + 1
    except:
        break   
for key in list(d.keys())[-8:]:
    print(key,d[key])

发表于 2025-04-03 20:21:07 回复(0)
分析题目需求可以快速发现,我们需要快速判断字符串是否出现过并计数,以及维持时间顺序。前一个可以用hashset或者hashmap实现,后一个可以用list简单实现,二者结合的结果就是一种思路
利用hashmap达到查重的效果并顺便存储索引(出现时的时间点),再利用列表统计出现次数
发表于 2025-03-28 00:47:00 回复(0)
import sys
result={}
for lines in sys.stdin.readlines():
    address,line_num = lines.strip().split(" ") #分割出地址和行号
    filename=address.split("\\")[-1]    #分割出文件名
    filename_out=filename if len(filename)<=16 else filename[-16:]  #w文件名如果超出16位,只保留最后16位文件名

    temp_filename=filename_out+"_"+line_num #为确保字典能够记录相同文件名不同行号的情况,将新文件名修改为文件名+行号
    if temp_filename not in result: #如果新文件名不在字典中,赋值
        result[temp_filename]=1
    else:   #如果已经存在相同文件名相同行号文件
        result[temp_filename]+=1
if len(result.keys())<=8:   #如果统计的数据小于8个,全部输出
    for key,value in result.items():
        print(key.split("_")[0],key.split("_")[1],value)#key.split("_")文件名和行号分割
else:   #如果大于8个,输出最后8个文件
    for key in list(result.keys())[-8:]:
        print(key.split("_")[0],key.split("_")[1],result[key])
发表于 2025-03-08 18:51:51 回复(0)
统计输入,统计错误路径后16位,去重+1加入到一个数组,再输出数组的后8个
in_errors = []
out_errors = []
while True:
    try:
        error = input()
        in_errors.append(error)
    except:
        break
for i in in_errors:
    info = i.split()
    pos = info[1]
    path = info[0]
    path1 = path.split('\\')
    l = len(path1)
    name = path1[l-1]
    l2 = len(name)
    if l2 > 16:
        name = name[l2-16:]
    out_info = [name,pos,1]
    if len(out_errors) == 0:
        out_errors.append(out_info)
    else:
        f1 = 0 
        for i2 in out_errors:
            if i2[0] == out_info[0] and i2[1] == out_info[1]:
                i2[2] += 1
                f1 = 1
                break
        if f1 == 0:
            out_errors.append(out_info)
num = len(out_errors)
print(out_errors)
a = num - 8
if num <= 8:
    for b in out_errors:
        print(str(b[0])+' '+str(b[1])+' '+str(b[2]))
else:
    while a < num:
        f3 = a
        a += 1
        c = out_errors[f3]
        print(str(c[0])+' '+str(c[1])+' '+str(c[2]))


发表于 2024-10-16 09:37:51 回复(0)
import sys
b=str()
lis=list()
dic=dict()
for line in sys.stdin:
    a = line.split('\\')
    c=str(a[-1]).index(' ')
    d=str(a[-1])[:c]
    e=str(a[-1])[c+1:-1]
    if len(d)>16 and str(a[-1])[c-16:-1] in dic.keys():
        dic[str(a[-1])[c-16:-1]]+=1
    elif len(d)<=16 and str(a[-1])[:-1] in dic.keys():
        dic[str(a[-1])[:-1]]+=1
    else:
        if len(d)>16:
            dic[str(a[-1])[c-16:-1]]=1
        else:
            dic[str(a[-1])[:-1]]=1
lis=list(dic)
if len(lis)>=8:
    ii=-8
    while ii<0:
        print(lis[ii],dic[lis[ii]])
        ii+=1
else:
    ii=0
    while ii<len(lis):
        print(lis[ii],dic[lis[ii]])
        ii+=1
发表于 2024-09-07 23:10:03 回复(0)
d = {}#初始化字典
while 1:#循环输入
    try:
        s = input().split("\\")[-1]#分割取最后一个元素
        s = s.split(" ")#将最后一个元素分割为一个列表
        s[0]=s[0][-16:]#取错误的后16位
        s = tuple(s)#列表不能作为字典的key,将列表转换为元组
        if s not in d:#加入字典
            d[s] = 1
        else:
            d[s] += 1
    except:
        break
last_d = list(d.keys())[-8:]#将字典的key变为列表取后八位
for i in last_d:#遍历列表last_d
    print("{} {} {}".format(i[0], i[1], d[i]))#格式化输出

编辑于 2024-03-06 14:08:13 回复(0)
#使用列表的形式记录
l=[]
ll=[]
while True:
    try:
        s=input().split('\\')
        s1=s[-1]
        s2=s1.split(' ')
        data=s2[0][-16:]+' '+s2[1]

        if data not in l:
            l.append(data)
            ll.append(1)
        else:
            ll[l.index(data)]+=1
    except:
        break
coder=l[-8:]
coder2=ll[-8:]
for i in range(len(coder)):
    print(coder[i],coder2[i])

#第二种方式,采用字典键值对的模式
l=[]
ll={}
while True:
    try:
        s=input().split('\\')
        s1=s[-1]
        s2=s1.split(' ')
        data=s2[0][-16:]+' '+s2[1]
        if data not in l:
            l.append(data)
            ll[data]=1  #字典中键为data的值赋值为1
        else:
            ll[data]+=1
    except:
        break
coder=l[-8:]  #将列表进行切片,然后根据字典中的键来获取键值对。
for item in coder:
    print(item,ll[item])

编辑于 2024-03-04 11:33:35 回复(0)
import sys

def main():
    map1 = {}
    # 双向队列,用于记录出入的顺序
    recoder = []
    for line in sys.stdin:
        a = line.split()
        list1 = a[0].split('\\')
        # 取后16位
        if len(list1[-1]) > 16:
            list1[-1] = list1[-1][-16:]
        fileName = list1[-1] +' '+ a[1]
        if fileName in map1:
            map1[fileName] += 1
        else:
            recoder.append(fileName)
            map1[fileName] = 1
        if len(recoder) > 8:
            remove = recoder.pop(0)
            map1[remove] = 0

    # 统计最后的8个结果:
    for item in recoder:
        print( item + ' '+ str(map1[item]))

if __name__ == '__main__':
     main()

发表于 2023-09-14 17:01:48 回复(0)
a\b\ccckkkkkkkkkkkkkkkk 456
a\b\uuukkkkkkkkkkkkkkkk 456
感觉像这种不因该算同一个(虽然说大于16的忽略)
发表于 2023-04-18 20:23:40 回复(0)
得注意审题
import sys
import json

def error_record():
    errors_line_dict_list = list()
    errors_count = dict()
    for line in sys.stdin:
        file_name, code_line = line.split()
        file_name = file_name.split('\\')[-1]
        if len(file_name) > 16:
            file_name = file_name[-16:]
        tmp_dic = {file_name: code_line}
        dump_tmp_dic = json.dumps(tmp_dic)
        if dump_tmp_dic not in errors_line_dict_list:
            errors_count[dump_tmp_dic] = 1
        else:
            errors_count[dump_tmp_dic] += 1
            continue
        errors_line_dict_list.append(dump_tmp_dic)
    if len(errors_line_dict_list) > 8:
        errors_line_dict_list = errors_line_dict_list[-8:]
    for dump_tmp_dic in errors_line_dict_list:
        tmp_dic = json.loads(dump_tmp_dic)
        file_name, line_num = list(tmp_dic.items())[0]
        print(f'{file_name} {line_num} {errors_count.get(dump_tmp_dic)}')


def main():
    error_record()

if __name__ == '__main__':
    main()

            





发表于 2023-02-14 15:59:59 回复(0)
import sys
wrong_dic={}
idx = 0
for line in sys.stdin:
    a = line.split("\\")
    wrong_title = a[-1].split(' ')[0][-16:]
    wrong_time = a[-1].split(' ')[-1]
    wrong = wrong_title+' '+wrong_time.strip()
    wrong_dic[wrong] = wrong_dic.get(wrong,[])+[idx]
key = list(wrong_dic.keys())[-8:]
for i in key:
    print(i,len(wrong_dic[i]))
发表于 2023-02-06 12:31:59 回复(0)
理清逻辑:不重复记录(作为字典元素里最好),重复需要计数,因此最初设置defaultdict(lambda: 1)重复加一就好。
只需要最后八条,因此把字典的元素放一个列表中,最后取[-8:]就好。
发表于 2022-09-14 20:58:00 回复(1)
import sys

def process_string(r_list):
    row = r_list[-1]
    record = r_list[0].split('\\')[-1]
    record = record[-16:]
    return [record, row]
    
err_list = []
    
for line in sys.stdin:
    a = line.split()
    err_list.append(process_string(a))

recorded_list = {}

for item in err_list:
    key_i = item[0]+'-'+item[1]
    if key_i not in recorded_list.keys():
        recorded_list[key_i] = 1
    else:
        recorded_list[key_i] += 1

key_l = list(recorded_list.keys())
if len(key_l) >= 8:
    for i in range(8):
        err = key_l[i-8].split('-')
        print(err[0], err[1], recorded_list[key_l[i-8]])
else:
    for i in range(len(key_l)):
        err = key_l[i].split('-')
        print(err[0], err[1], recorded_list[key_l[i]])
        

发表于 2022-09-13 17:32:23 回复(0)
import sys 
res=[]
for line in sys.stdin:
    line = line.strip().split('\\')
    ans=line[-1].split(' ')
    if len(ans[0])>16:
        res.append(ans[0][-16:]+' '+ans[1])
    else:
        res.append(ans[0]+' '+ans[1])
hash_table={}
for i in res:
    if i not in hash_table:
        hash_table[i]=1
    else:
        hash_table[i]+=1
if len(hash_table)>8:
    out=list(hash_table.items())
    for i in range(-8,0):
        print(out[i][0],out[i][1])
if len(hash_table)<=8:
    out=list(hash_table.items())
    for i in range(len(out)):
        print(out[i][0],out[i][1])

发表于 2022-09-02 17:48:40 回复(0)
题目写这么长,所以循环记录时什么意思?
发表于 2022-08-28 14:39:19 回复(0)
第一条645为啥没记
发表于 2022-08-19 14:44:58 回复(0)
a = []
aa = []
while True:
    try:
        b, c = input().split(' ')
        b = b.split('\\')[-1]
        if len(b) > 16:
            b = b[-16:]
        d = [b, c]
        if d not in a:
            a.append(d)
            aa.append(1)
        else:
            aa[a.index(d)] += 1
    except:
        break
for i in range(0 if len(a) <= 8 else len(a)-8, len(a)):
    print('{} {} {}'.format(a[i][0], a[i][1], aa[i]))

发表于 2022-08-18 16:01:57 回复(0)
err = []
while True:
    try:
        err.append(input())
    except:
        break 
from collections import Counter 
count = Counter()
for i in range(len(err)):
    name = err[i].split()[0].split('\\')[-1][-16:]
    num = err[i].split()[1]
    tmp = name+' '+num 
    count[tmp] += 1 

n = 0 
for i,j in count.items(): 
    if n >= len(count) - 8:
        print('{} {}'.format(i,j))
    n+=1

发表于 2022-08-18 11:13:39 回复(0)
这一题理解题目的意思比较重要,另外就是设计数据的结构,因为使用的是python语言,考虑使用字典来存储数据:
    使用 实际的错误记录(最后一个\后的最后16位 + ‘ ’ + 记录行数)作为键,出现的次数(计数)作为值,这样比较方便存储与修改。

rawstrs = []
mid_dict = dict()
output_lst = []
while True:
    try:
        mid_raw = input()
        str_all = mid_raw.split(' ')[0]
        str_num = mid_raw.split(' ')[1]
        if mid_raw not in rawstrs:
            rawstrs.append(mid_raw)
            key = str_all.split('\\')[-1][-16:] + ' ' + str_num
            if mid_dict.get(key, 'notfound') != 'notfound':
                mid_dict[key] += 1
            else:
                mid_dict[key] = 1
    except:
        break
mid_keys_lst = list(mid_dict.keys())[-8:]
for key, value in mid_dict.items():
    if key in mid_keys_lst:
        print('{} {}'.format(key,value))


发表于 2022-08-16 20:45:25 回复(0)