分组统计

分组统计

http://www.nowcoder.com/questionTerminal/5cb47b86911c4aa48722e531a51ec823

这题有的条件没给清楚。。数字范围应该是小于等于1000,组数是小于等于100(调bug调了俩小时发现是hash数组的列应该赋1001而我赋了1000!!!)
思路:用一个二维数组来存储每一组中某一数字的个数。行标作为组号,列标为数字,值为次数。

#include<stdio.h>
#include<string.h>
int main()
{
    int m,n;
    scanf("%d",&m);
    while(m--)
    {
        int hash[100][1001];
        memset(hash,-1,sizeof(hash)); // 初始设-1以便后面确定哪一组是合法的
        scanf("%d",&n);
        int num[n]; // 存储读入的n个数字
        int flag[1001] ={0}; // 标记哪些数字出现过
        int group,numcnt = 0; // numcnt为不同的数字个数
        for(int i = 0;i<n;i++)
        {
            scanf("%d",&num[i]);
            if(!flag[num[i]]) // flag设1
            {
                flag[num[i]] = 1;
                numcnt ++; // 不同数字个数加1
            }
        }
        int max = 0; // 最大组号(由于不确定组号是顺序从1到n还是怎样)
        for(int i = 0;i<n;i++) //读组号并更新hash
        {
            scanf("%d",&group);
            if(hash[group][0] == -1) // 令这一行为合法的(设0)
                for(int j = 0;j<1001;j++)
                    hash[group][j] = 0;
            hash[group][num[i]] ++; // 对应的group行,num[i]列加1
            if(group > max) // 找出最大组号
                max = group;
        }
        for(int i = 0;i<=max;i++) // 从0开始到最大组号遍历hash
        {
            if(hash[i][0] != -1) // 当且仅当组号合法时再输出
            {
                int cnt2 = 0; // 用于找出flag为1的数字
                printf("%d={", i);
                for (int j = 0; j < numcnt; j++) // 每一组的大括号里面就numcnt个数字
                {
                    while (!flag[cnt2++]); // 找出当前flag为1的数字
                    if (j != numcnt - 1)
                        printf("%d=%d,", cnt2 - 1, hash[i][cnt2 - 1]);
                    else
                        printf("%d=%d", cnt2 - 1, hash[i][cnt2 - 1]);
                }
                printf("}\n");
            }
        }
    }
    return 0;
}
全部评论
谢谢!网上一堆人都用二维数组,但是都没说题目条件不充分的问题。
点赞 回复 分享
发布于 2021-02-21 15:44

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务