题解 | 分组统计
分组统计
https://www.nowcoder.com/practice/5cb47b86911c4aa48722e531a51ec823
这题目前对我来说巨难,for range循环我还用不了这么熟练,借助DeepSeek实现了以下代码
#include <cstdio> #include <map> #include <vector> using namespace std; int main() { int m, n; scanf("%d", &m); // 读取测试用例数量 while (m--) { scanf("%d", &n); // 读取每组数据的数量 int arr[100], group[100]; for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); // 读取数值 } for (int i = 0; i < n; i++) { scanf("%d", &group[i]); // 读取分组 } // 使用 map 存储每个分组的所有数 map<int, vector<int>> groupMap; for (int i = 0; i < n; i++) { groupMap[group[i]].push_back(arr[i]); } // 遍历每个分组 for (auto &[groupNum, nums] : groupMap) { // 统计每个数的出现次数 map<int, int> countMap; for (int num : nums) { countMap[num]++; } // 输出分组信息 printf("%d={", groupNum); bool first = true; for (auto &[num, count] : countMap) { if (!first) { printf(","); } printf("%d=%d", num, count); first = false; } printf("}\n"); } } return 0; }
但是还差一个逻辑,就是所有的数,本组内没出过的数也要统计一个0,这部分是自己实现的
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <map> #include <vector> #include <set> using namespace std; int main() { int m, n; scanf("%d", &m); // 读取测试用例数量 while (m--) { scanf("%d", &n); // 读取每组数据的数量 set<int> occur; int arr[100], group[100]; for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); // 读取数值 occur.insert(arr[i]); } for (int i = 0; i < n; i++) { scanf("%d", &group[i]); // 读取分组 } // 使用 map 存储每个分组的所有数 map<int, vector<int>> groupMap; for (int i = 0; i < n; i++) { groupMap[group[i]].push_back(arr[i]); } // 遍历每个分组内的所有数,并统计出现次数 for (auto& [groupNum, nums] : groupMap) { // 统计每个数的出现次数 map<int, int> countMap; for (int num : nums) { countMap[num]++; } // 没出现过的数置为0 for (auto it = occur.begin(); it != occur.end(); it++) { if (countMap.find(*it) == countMap.end()) { countMap[*it] = 0; } } // 输出分组信息 printf("%d={", groupNum); bool first = true; for (auto& [num, count] : countMap) { if (!first) { printf(","); } printf("%d=%d", num, count); first = false; } printf("}\n"); } } return 0; }