题解 | 分组统计
分组统计
https://www.nowcoder.com/practice/5cb47b86911c4aa48722e531a51ec823
#include<bits/stdc++.h>
using namespace std;
int main() {
int m; // 样例数
cin >> m;
while(m--) {
int n; // 每个样例的数字个数
cin >> n;
vector<int> a[101]; // a[i]存储第i组的所有数字
vector<int> nums(n), groups(n);
set<int> all_nums; // 存储所有出现过的数字(自动去重+升序)
// 1. 输入数字并收集所有唯一数字
for(int i=0; i<n; i++) {
cin >> nums[i];
all_nums.insert(nums[i]); // 去重并排序
}
// 2. 输入分组并归入对应分组
for(int i=0; i<n; i++) {
cin >> groups[i];
a[groups[i]].push_back(nums[i]);
}
// 3. 把set转成vector,方便遍历
vector<int> unique_nums(all_nums.begin(), all_nums.end());
// 4. 按分组号从小到大遍历输出
for(int group=1; group<=100; group++) {
if(!a[group].empty()) { // 只输出有数字的分组(也可去掉此判断输出所有分组)
// 统计当前分组中每个唯一数字的次数(包括0次)
map<int, int> num_cnt;
// 先初始化所有唯一数字的次数为0
for(int num : unique_nums) {
num_cnt[num] = 0;
}
// 再统计实际出现的次数
for(int k=0; k<a[group].size(); k++) {
int num = a[group][k];
num_cnt[num]++;
}
// 5. 按格式输出(包含0次的数字)
cout << group << "={";
bool is_first = true;
for(int num : unique_nums) {
if(!is_first) {
cout << ",";
}
is_first = false;
cout << num << "=" << num_cnt[num];
}
cout << "}" << endl;
}
}
}
return 0;
}
查看20道真题和解析
