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

每日一题——提取服务器物料型号并统计出现次数

提取服务器物料型号并统计出现次数

    • 一、题目描述
      • 💡 输入描述:
      • 📤 输出描述:
    • 二、样例示例
      • 🎯 示例1
      • 🎯 示例2
    • 三、解题思路
      • 1. 子串提取策略:正则匹配
      • 2. 统计策略:哈希映射
      • 3. 输出策略
    • 四、复杂度分析
    • 五、C++ 代码实现(含详细注释)
    • 六、总结与拓展

在企业IT运维或报废资产管理中,分析各台服务器上的CPU、内存、主板型号,并统计可回收配件的数量,是一个典型的文本处理与统计问题。

本题模拟了这样的场景,给定每台服务器的物料编码字符串,我们要从中提取出每类备件的首个型号标识,统计所有服务器上每种型号的数量,并按字典序输出。


一、题目描述

💡 输入描述:

  • 第一行为一个整数 $N$,表示服务器的数量,$1 \leq N \leq 1000$;
  • 第二行为 $N$ 个物料编码字符串,使用空格隔开。每个字符串长度不超过 $100$,包含字母和数字。

每个字符串中包含若干段代表配件型号的子串:

  • CPU 型号格式为:C + 两位数字,例如:C01
  • 内存型号格式为:M + 两位数字,例如:M23
  • 主板型号格式为:B + 两位数字,例如:B05

注意:每类备件的型号可能出现多次,但我们只取第一次出现的。


📤 输出描述:

共三行输出,每行对应一类配件的型号统计:

  • 第一行为 CPU 型号;
  • 第二行为内存型号;
  • 第三行为主板型号。

格式要求如下:

  • 每个型号及其数量用 型号,数量 表示;
  • 多个型号之间用英文分号 ; 分隔;
  • 相同类的型号需按照字典序升序排序

二、样例示例

🎯 示例1

输入:

2
C01M23B050130 C01M23B060130

输出:

C01,2
M23,2
B05,1;B06,1

🎯 示例2

输入:

3
C0CM23B05C130X11 C01M23B050130Y22 C01M24B05C130Z33

输出:

C01,2;C13,1
M23,2;M24,1
B05,3

三、解题思路

1. 子串提取策略:正则匹配

  • 使用正则表达式提取第一个匹配的型号子串:

    • CPU:C\d{2}
    • 内存:M\d{2}
    • 主板:B\d{2}
  • 使用 regex_search 获取首次出现的对应子串。

2. 统计策略:哈希映射

  • 使用 map<string, int> 记录每类备件的型号及其出现次数。

3. 输出策略

  • 对每类 map 的 key 进行字典序排序(map 本身已按字典序),格式化输出。

四、复杂度分析

  • 时间复杂度:

    • 每个字符串长度为 $L$,查找3类型号 $O(L)$,总共 $N$ 个字符串,故为 $O(NL)$;
    • 每类 map 的排序为 $O(K\log K)$,其中 $K$ 为不同型号数量,通常远小于 $NL$。
    • 总体为:$O(NL + K\log K)$。
  • 空间复杂度:

    • 输入为 $O(NL)$;
    • 三个 map 的空间为 $O(K)$。

五、C++ 代码实现(含详细注释)

#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(false); // 提高 cin/cout 效率cin.tie(nullptr);            // 禁止 cin 与 stdout 同步,提高性能int n;cin >> n; // 输入服务器数量vector<string> codes(n); // 用于存储每台服务器的物料编码for (int i = 0; i < n; i++) {cin >> codes[i]; // 读入每个编码字符串}// 三个 map 分别统计 CPU、内存、主板的型号及其数量map<string, int> cpuMap, memMap, boaMap;// 三个正则表达式模式(匹配格式:字母 + 两位数字)regex rc("C\\d{2}"); // 匹配 C01、C13 等regex rm("M\\d{2}"); // 匹配 M23 等regex rb("B\\d{2}"); // 匹配 B05、B06 等for (auto &s : codes) {smatch m;// 查找 CPU 型号string cpu = "";if (regex_search(s, m, rc)) cpu = m.str(0);// 查找内存型号string mem = "";if (regex_search(s, m, rm)) mem = m.str(0);// 查找主板型号string boa = "";if (regex_search(s, m, rb)) boa = m.str(0);// 更新三个 map 中的数量统计if (!cpu.empty()) cpuMap[cpu]++;if (!mem.empty()) memMap[mem]++;if (!boa.empty()) boaMap[boa]++;}// 输出函数:按格式输出 map 内容auto printMap = [](const map<string,int>& M) {bool first = true;for (auto &p : M) {if (!first) cout << ";";           // 多个型号之间加分号cout << p.first << "," << p.second; // 型号,数量first = false;}cout << "\n";};// 依次输出 CPU、内存、主板型号统计printMap(cpuMap);printMap(memMap);printMap(boaMap);return 0;
}

六、总结与拓展

本题考查了:

  • 字符串匹配与提取:使用正则表达式高效提取指定格式子串;
  • 哈希统计与排序输出:结合 map 和格式控制完成需求;
  • 数据结构选型与性能控制:合理利用 STL 的特性简化实现;

适合作为 C++ 基础练习题,也可以拓展到更复杂的日志解析或配置提取任务中。


http://www.lryc.cn/news/2392016.html

相关文章:

  • 宫格导航--纯血鸿蒙组件库AUI
  • RNN 循环神经网络:原理与应用
  • React---day2
  • 若依框架 账户管理 用户分配界面解读
  • 文档贡献 | 技术文档贡献流程及注意事项(保姆级教程)
  • open-vscode-server +nodejs 安装
  • 知行之桥如何将消息推送到钉钉群?
  • 09《从依赖管理到容器化部署:Maven 全链路实战笔记,解锁 Java 项目自动化构建的终极奥秘》
  • <el-date-picker>组件传参时,选中时间和传参偏差8小时
  • ST MCU CAN模块--TTCAN模式浅析
  • MySQL数据库零基础入门教程:从安装配置到数据查询全掌握【MySQL系列】
  • 动态规划(7):背包问题
  • 谷歌浏览器Google Chrome v137.0.7151.41 中文版本版+插件 v1.11.1
  • 《深入解析UART协议及其硬件实现》-- 第三篇:UART ASIC实现优化与低功耗设计
  • Hadoop常用端口号和配置文件
  • Apache Paimon:存储结构、写入及其源码分析
  • 19、Python字符串高阶实战:转义字符深度解析、高效拼接与输入处理技巧
  • 国芯思辰| 同步降压转换器CN2020应用于智能电视,替换LMR33620
  • 6个月Python学习计划 Day 8 - Python 函数基础
  • DeepSeek 提示词大全
  • 俄罗斯无人机自主任务规划!UAV-CodeAgents:基于多智能体ReAct和视觉语言推理的可扩展无人机任务规划
  • 结构性设计模式之Bridge(桥接)
  • CSS篇-1
  • Android 16系统源码_无障碍辅助(一)认识无障碍服务
  • 分布式数据库备份实践
  • 如何发布npm包?
  • 鸿蒙---使用真机模拟器的时候,图片不加载问题
  • 实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.6 R语言解题
  • .NET 8使用AOT发布ASP.NET Core应用
  • OpenCV计算机视觉实战(8)——图像滤波详解