当前位置: 首页 > article >正文

华为机试HJ19 简单错误记录

首先看一下题

描述

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

处理: 

1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是相同的错误记录。

2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;

3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录

4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准

数据范围:错误记录数量满足 1≤n≤100  ,每条记录长度满足  1≤len≤100 

输入描述:

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

输出描述:

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

示例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不会被记录。  

一、问题分析

首先读题,题目要求:

1.开发一个简单的错误记录功能小模块

2.能够记录出错的代码所在的文件名和行号

3.记录最多8条错误记录

4.循环记录

5.只输出最后出现的八条错误记录

6.相同的错误只需要记录一条,但是错误计数累加

7.最后的一个斜杠后面的带后缀名的部分(保留16位)和行号这两个都完全匹配的才是“相同”的错误

8.超过16个字符的文件名,只记录文件的最后有效16个字符

9.输入的文件可能带路径,但是记录的文件名称不带路径,哪怕文件路径不同,只要名字的最后16个字符相同,也被视为相同的错误记录

这里我有点疑问,是不是最后十六位和行号都需要相同才算是相同的错误记录?

10.循环记录时,只以第一次出现的顺序为准,后面重复的不会更新他的出现时间,仍以第一次为准

这句话我认为意思是说我们虽然只需要输出8条记录但是我们要记录全部的错误记录,这样才能记住之前出现的时间,才能保证后面重复的出现不会更新他的出现时间

11.错误记录数量n在[1,100]的范围

12.每条记录的长度len在[1,100]的范围

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

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

二、解题思路

1.首先我们需要定义一个字符串record[101]一个整数line用来读取错误记录

2.然后我们思考一下用什么储存我们的错误记录

首先我们需要储存的数据有文件名、代码行数、错误次数这三种数据

我们可以定义一个字符串数组recordname[错误记录数量][17]用来存储我们错误的记录的名字

其中错误记录数量是我们给他分配的空间,在读取的过程中我们使用到的空间时候可能会小于这个数字,使用的时候我们将错误记录的序号记录在上面

然后我们定义一个数组recordinfo[错误记录数量][2]用来记录我们错误记录的代码行数、错误次数这两个数据分别对应recordinfo[错误记录数量][0]和recordinfo[错误记录数量][1]

3.我们还需要一个整数int count = 0;用来计算我们的出现的错误记录数量

4.然后我们就可以开始逐行读取数据了

5.我们先把数据存储到record和line中

6.我们将record中最后的/之后的部分储存到一个新的char filename[100]中

7.我们使用strlen测量一下filename的长度并且将长度储存到len中

8.对于长度大于16的情况,我们只保留最后16个字符,也就是说我们

定义一个char newfilename[17];

比如filename的长度是20,

我们截取第3-19个位置的字符到我们的newfilename的第0-16个位置中.然后我们第17位设为'\0'字符串结束符

处理完名字之后我们开始在现有的记录中查找是否有相同的记录,如果有(名字相同且行数相同)那么我们错误次数加一

如果没有相同的记录那么我们count加一,并且将recordname[count] = newfilename;

recordinfo[count][0] = line;

recordinfo[count][1] = 1;

9.循环结束后我们做一个判断,

如果count >= 8 

比如有九条记录,那么我们输出第2-9条记录

也就是count-8到count

如果count < 8,那么我们输出从0到count的记录

三、具体步骤

使用的语言是C

#include <stdio.h>
#include <string.h>

char* getFilename(const char *path) {
    int len = strlen(path);
    for(int i = len; i > 0; i--) {
        if(path[i] == '\\') {
            return (char*)(path + i + 1);
            break;
        }
    }
    return (char*)path;
}
int main() {
    char record[101];
    int linenumber;
    char recordname[100][17];
    int recordinfo[100][2];
    int count = 0;
    while (scanf("%s %d", record, &linenumber) != EOF) { 
        char *filename = getFilename(record);
        //printf("filename is %s\n", filename);
        int len = strlen(filename);
        char newfilename[17];
        if (len > 16) {
            strncpy(newfilename, filename + len - 16, 16);
            newfilename[16] = '\0';
        } else {
            strcpy(newfilename, filename);
        }
        int findsame = 0;
        for(int i = 0; i < count; i++){
            if((strcmp(recordname[i], newfilename) == 0) && (recordinfo[i][0] == linenumber)){
                recordinfo[i][1]++;
                // printf("when file name is %s, the i is %d\n", recordname[i], i);
                // printf("the new filename is %s", newfilename);
                // printf("find same error.\n");
                findsame = 1;
                break;
            }
        }
        if(findsame == 0){
            strcpy(recordname[count], newfilename);
            recordinfo[count][0] = linenumber;
            recordinfo[count++][1] = 1;
        }
    }

    if(count > 8) {
        for(int i = count - 8; i < count; i++){
            printf("%s %d %d\n", recordname[i], recordinfo[i][0], recordinfo[i][1]);
        }
    } else {
        for(int i = 0; i < count; i++) {
            printf("%s %d %d\n", recordname[i], recordinfo[i][0], recordinfo[i][1]);
        }
    }
    return 0;
}

作者:来泡池子了的西红柿很奔放
链接:https://www.nowcoder.com/discuss/681233127540355072
来源:牛客网

20241030 18:00 - 20:18


http://www.kler.cn/a/377195.html

相关文章:

  • 功能超全的客服快捷回复软件
  • 大数据新视界 -- 大数据大厂之 Impala 性能优化:数据存储分区的艺术与实践(下)(2/30)
  • 城镇保障性住房管理:SpringBoot技术应用
  • 一文搞懂Linux kernel编译步骤
  • 哈希表(Hash Table)、跳表(Skip List) 和 有序字典(Ordered Dictionary) 的详细介绍
  • 【大数据学习 | kafka高级部分】kafka的快速读写
  • 管家婆财贸ERP BB087.销售单复制一行
  • 第二十五章 Vue父子通信之sync修饰符
  • JavaScript 生成二维码
  • 【棋盘覆盖——匈牙利算法】
  • Vue main.js引入全局progress组件原型实例,加载中动画组件原型实例
  • 在B端管理系统中,复杂或者DIY功能,都依赖哪些编辑器/设计器
  • 从技术与市场角度看:3D 创作软件与信创系统的 “距离”
  • node.js下载、安装、设置国内镜像源(永久)(Windows11)
  • Django-中间件
  • 如何理解ref,toRef,和toRefs
  • 《云计算网络技术与应用》实训8-1:OpenvSwitch简单配置练习
  • 写一个 EventBus 实现微信小程序的发布订阅,支持全局消息通知、跨页面通信,高效好用!
  • 形态学操作篇 原理公式代码齐活
  • Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
  • 《GBDT 算法的原理推导》 11-13初始化模型 公式解析
  • flask框架用法介绍(二):Flask和forms
  • 百度SEO与SEM到底有什么区别?福建企业老板们需要了解的关键点【百度SEO专家】
  • 高效视频制作大提速,视频剪辑软件的高级自定义命令功能批量调整视频的色调、饱和度和亮度,轻松驾驭视频编辑技巧
  • JAVA WEB — HTML CSS 入门学习
  • k8s技术全景:架构、应用与优化