题解 | 分组统计

分组统计

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;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务