题解 | 分组统计

分组统计

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

全部评论

相关推荐

04-13 09:56
已编辑
嵌入式工程师
点赞 评论 收藏
分享
03-02 08:18
集美大学 Java
钱嘛数字而已:没有赛事奖项么?另外,项目经历字有点多哈,建议突出一下重点:用的什么技术,解决什么问题,达到什么效果。
大家都开始春招面试了吗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务