NowCoder——分组统计

本文介绍了一个使用C++实现的数组排序和数据统计算法。该算法首先对输入的数据进行排序,然后去除重复项并统计每组数据的频率。通过实例演示了如何对数组进行分组,并对每组内的数据进行统计。

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;

/**********************************/
//1
//7
//3 2 3 8 8 2 3
//1 2 3 2 1 3 1
//3 8 3 2 8 3 2
//1 1 1 2 2 3 3

//1={2=0,3=2,8=1}
//2={2=1,3=0,8=1}
//3={2=1,3=1,8=0}
/**********************************/
//建立一个数组,保持这个数组的唯一性。
//1.根据第二个数组对A中的数组进行划分
//2.根据划分好的数组分别排序进行数据统计
typedef struct Sat
{
    int data;
    int group;
}Sat;
void ResortSat(Sat N[],int n)
{
    int v,m;
    int i,j;
    for(i=0;i<n;i++)
    {
        v=N[i].group;//后面的元素,准备新加入的元素。
        m=N[i].data;
        j=i-1;       //前面的元素。
        while(j>=0&&N[j].group>v)//前面的元素比新加入的元素大
        {
            N[j+1].data=N[j].data;     //前面的元素后移一位。把相应的N[j]放到N[j+1]的位置。
            N[j+1].group=N[j].group;   //结构体在进行值修改的时候,要把包含的项目都相应挪动。
            j--;                       //j-- j继续指向前一个位置元素
        }
        N[j+1].group=v;                //跳出循环只有两个可能,第一种情况j小于0了,意味着当前i元素是最小的,放在第一个位置。
        N[j+1].data=m;                 //第二种情况,就是前面j个元素没有比i位置元素小的了,那么第j+1即是i元素的位置了。
    }

}
//3 8 3 2 8 3 2
//1 1 1 2 2 3 3
//用来记录一组数中有多少种类的数,组内去重
int  Takenote(Sat N[],int B[],int c[],int n)
{
    int m;
    int i,j;
    for(i=0;i<n;i++)
    {
        B[i]=N[i].data;
    }
    for(i=0;i<n;i++)
    {
        m=B[i];
        j=i-1;
        while(j>=0&&B[j]>m)
        {
            B[j+1]=B[j];
            j--;
        }
        B[j+1]=m;
    }
    int len=0;
    int flag[1000]={0};
    for(i=0;i<n;i++)
    {
       if(flag[B[i]]==0)
       {
           c[len++]=B[i];
           flag[B[i]] = 1;
       }

    }
    for(i=0;i<len;i++)
    {
        printf("%d ",c[i]);
    }
    return len;
}

//3 8 3 2 8 3 2
//1 1 1 2 2 3 3
//2 3 8
void GroupcountSat1(Sat N[],int c[],int length,int n)
{
    int i,k,s;
    int A[100]={0};
    memset(A,0,sizeof(A));

    for(i=0; i<n; i++)
    {
        printf("%d={",N[i].group);
        A[N[i].data]=1;
        for(s=i+1;s<=n;s++)              //两层循环为了对比前一元素组别和后一元素组别一致。
        {
            if(N[i].group==N[s].group)  //组别相同
            {
                if(!A[N[s].data])      //检查数组A中这个值的位置是否为空,如果为空,变成1
                {
                    A[N[s].data]=1;
                }
                else
                {
                    A[N[s].data]+=1;    //如果不为空,当前位置+1。

                }
            }
            else                       //如果后面组别不相等了,那么第一组结束,先输出第一组。
            {
                for(k=0; k<length; k++) //把C中元素拿出来做对比
                {
                    if(A[c[k]]!=0)
                    {
                        printf("%d=%d",c[k],A[c[k]]);
                    }
                    else
                    {
                       printf("%d=0",c[k]);
                    }
                    if(k!=length-1)
                    {
                        printf(",");
                    }
                }
                printf("}\n");
                memset(A,0,sizeof(A)); //一组比对结束,A数组重新初始化。
                i=s-1;
                break;
            }

        }


    }
}

void Print(Sat N[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%d ",N[i].data);
    }
    printf("\n");
    for( i=0;i<n;i++)
    {
        printf("%d ",N[i].group);
    }
}


int main()

{
    int m,n;
    cin>>m>>n;
    Sat N[n];
    int B[n];
    int c[n];
    int i,j;
    int length;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
          scanf("%d",&N[j].data);
        }
        for(j=0; j<n; j++)
        {
            scanf("%d",&N[j].group);
        }
        ResortSat(N,n);            //对输入数据进行排序
        Print(N,n);
        printf("\n");
        length=Takenote(N,B,c,n); //用来计算输入数据元素的唯一性
        printf("\n");
        GroupcountSat1(N,c,length,n);
    }



    return 0;

}

在这里插入图片描述
注:此题虽然运行出来结果,但在牛客上提交不通过,还在找问题。。 ̄□ ̄||

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值