提取服务器物料型号并统计出现次数
- 一、题目描述
- 💡 输入描述:
- 📤 输出描述:
- 二、样例示例
- 🎯 示例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}
- CPU:
-
使用
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++ 基础练习题,也可以拓展到更复杂的日志解析或配置提取任务中。