博客
关于我
华为笔试-简单错误记录
阅读量:113 次
发布时间:2019-02-26

本文共 2251 字,大约阅读时间需要 7 分钟。

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

问题描述

我们需要开发一个简单的错误记录功能模块,能够记录出错的代码所在的文件名称和行号。具体要求如下:

  • 记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加。
  • 文件名超过16个字符时,只记录最后16个有效字符。
  • 文件路径可能存在,记录时需去除路径,只保留文件名。
  • 输入描述

    输入是一行或多行字符串,每行包括带路径文件名称、行号,两者用空格隔开。文件路径为Windows格式,例如:E:\V1R2\product\fpgadrive.c 1325

    输出描述

    将所有记录统计并输出,格式为:文件名代码行数数目,一个空格隔开。结果按数目从多到少排序,数目相同则按输入顺序排序。若超过8条记录,只输出前8条。文件名若超过16字符,输出最后16字符。

    解决思路

    1. 数据存储

    使用哈希表(字典)存储错误记录,键为文件名,值为记录的行号和计数。每次遇到相同文件名和行号的记录,计数增加,若超过8条则处理。

    2. 处理文件名

    • 如果文件名长度超过16字符,仅保留最后16个字符。
    • 若文件名不同但仅末尾16字符相同,不合并。

    3. 去除路径

    提取文件名,去除路径信息。

    4. 排序

    使用自定义比较器,按错误计数排序,计数相同按出现顺序排序。

    5. 优化

    通过哈希表和自定义排序结构实现,时间复杂度为O(n)存储,O(n log n)排序。

    代码实现

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;class Info {public: int rank; // 排序权重 int count; // 错误记录数 string file; // 文件名 Info(int _r, int _c, const string &_s) : rank(_r), count(_c), file(_s) {} bool operator<(const Info &other) const { if (count == other.count) { return rank < other.rank; } return count > other.count; }};int fun(const char *x) { int len = 0; while (*x++) len++; return len - 1;}int main() { char x[] = {'1','2','3','4'}; int m = fun(x); set
    errors; ifstream geoFile; geoFile.open("text.txt", ios::in); if (geoFile.is_open()) { string instr; while (getline(geoFile, instr)) { if (instr.empty()) break; size_t lastSlash = instr.rfind('\\'); string file = instr.substr(lastSlash + 1); int count = 1; auto it = errors.begin(); while (it != errors.end() && it->file == file) { count++; it++; } if (it == errors.end()) { errors.insert(Info(1, count, file)); } else { Info &existing = *it; existing.count += count; } } } geoFile.close(); vector
    result; for (const auto &info : errors) { string trimmed = info.file; size_t pos = trimmed.find(' '); if (pos > 16) { trimmed = trimmed.substr(pos - 16); } result.push_back({info.rank, info.count, trimmed}); } sort(result.begin(), result.end()); int outputCount = min(8, (int)result.size()); for (int i = 0; i < outputCount; ++i) { const Info &info = result[i]; cout << info.file << ' ' << info.count << ' '; }}

    代码解释

  • 类Info:用于存储错误记录的文件名和计数,并定义了自定义比较器,用于排序。
  • fun函数:计算字符串长度。
  • 主程序
    • 读取文件内容,提取文件名和行号。
    • 使用哈希表存储错误记录,处理重复和文件名长度。
    • 排序后输出前8条记录。
  • 通过这种方法,能够高效地处理错误记录,满足要求的存储和排序功能。

    转载地址:http://tcok.baihongyu.com/

    你可能感兴趣的文章
    OpenCV(1)读写图像
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    Openlayers实战:modifystart、modifyend互动示例
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>
    OpenLDAP编译安装及配置
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(二):GD32E23xx FreeRTOS移植
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenMV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
    查看>>