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

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

    • 一、题目描述
      • [💡 输入描述:](#💡 输入描述:)
      • [📤 输出描述:](#📤 输出描述:)
    • 二、样例示例
      • [🎯 示例1](#🎯 示例1)
      • [🎯 示例2](#🎯 示例2)
    • 三、解题思路
      • [1. 子串提取策略:正则匹配](#1. 子串提取策略:正则匹配)
      • [2. 统计策略:哈希映射](#2. 统计策略:哈希映射)
      • [3. 输出策略](#3. 输出策略)
    • 四、复杂度分析
    • [五、C++ 代码实现(含详细注释)](#五、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++ 代码实现(含详细注释)

cpp 复制代码
#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++ 基础练习题,也可以拓展到更复杂的日志解析或配置提取任务中。


相关推荐
艾莉丝努力练剑9 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
Once_day25 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
Trouvaille ~35 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
偷吃的耗子41 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
坚果派·白晓明1 小时前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
小镇敲码人1 小时前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
dazzle2 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵2 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法