练习:众数问题

来源:互联网 发布:黑色幽默电影 知乎 编辑:程序博客网 时间:2024/06/03 20:26

题目:众数问题

问题描述:给定含有n个元素的多重集合s,每个元素在s中出现的次数成为该元素的重数,多重集s中重数最大的元素称为众数,例子s={1,2,2,3,5},众数为2,重数为3
结果输出:输出格式:“众数--重数”
                   若最大重数为1,则为没有众数,输出“no plural”
                   若众数有多个时,全部都输出(两个之间换行)
p.s.本来题目关于有多个众数的时候只输出第一个或者最后一个,我这里就全部都输出好了

我一开始想法有点偏了,就是把元素全部排序,然后逐个搜索、计算重数,元素少一点还好说,只是到了7位数以上就变得慢了(7,8s),而且时间主要花在了排序上面...然后又想到了简便点的方法,就是另外建立一个数组用来计算每一个元素重复的次数,并记录最大重数,在输出时候直接根据最大重数来找到相应的元素并输出就可以了。

#include <iostream>#include <time.h>#include <stdlib.h>using namespace std;#define siz 101//随机数的范围+1int main(){    srand((unsigned)time(NULL));    int *pt=NULL,*res=NULL;    long n=0;    while(1)    {        cin>>n;        pt=new int [n]();        res=new int[siz]();//储存各个数字出现的次数        for(int i=0; i<n; i++)            pt[i]=rand()%(siz-1)+1;        for(int i=0; i<n; i++)//记录各个元素的重复次数            res[pt[i]]=res[pt[i]]+1;        int max=res[1];        for(int i=2; i<siz; i++)//找出最大的重复次数            max=max>res[i]?max:res[i];        if(max==1)            cout<<"no plural"<<endl;        else            for(int i=1; i<siz; i++)                if(max==res[i])                    cout<<i<<"--"<<max<<endl;    }    delete []pt;    delete []res;    return 0;}


p.s.结果的准确性可以debug那里看到对比

这个比一开始想的那个快了很多,但是元素有8位数时,就超1s了,大概1.5s,后面的就更慢了...

0 0