您的位置:首页 > 其它

CCF—出现次数最多的数

2016-04-05 19:27 323 查看
问题描述
给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。
输入格式

输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。

输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。

输出格式
输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。
样例输入

6

10 1 10 20 30 20

样例输出

10

时间限制:1.0s,内存限制:256MB

=======================================================分隔线=====================================================================

解法一:

一开始我的想法是:设置一个长度为10000的数组,初值为0。数组元素a[i]的下标i代表数字,元素的a[i]的值代表这个数字出现的个数。以样例为例,a[i]=1,a[10]=2,a[20]=2,a[30]=1.

设置两个int型的值,maxcnt和maxval。

IF MAXCNT<a[i]

MAXCNT=a[i]

MAXVAL=i

ELSE IF MAXCNT=a[i]

MAXVAL=i

int main(){
    clock_t start = clock();
    const int N1=10000;
    int a[N1];
    for(int i=0; i<N1;i++) a[i]=0;
    int n; cin >> n;
    int num;
    for(i=0; i<n; i++){
        cin >> num;
        a[num] +=1;
    }

//     a[1]=1; a[4]=2; a[5]=1;
//    for(i=0; i<N1;i++) cout << a[i] << ' ';
    int maxcount=a[0], maxvalue = 0;
    for(i=0; i<N1;i++){
        if(maxcount < a[i]){
            maxcount = a[i];
            maxvalue = i;
        }
        else if(maxcount==a[i]){
            if(a[i]==0)
                continue;
            maxvalue = i;
        }
    }
    cout << maxvalue << endl;
    clock_t finish = clock();
    cout << "程序运行了" << finish-start << "毫秒" << endl;
    return 0;
}
但是,这样的话程序运行时间太长,不合格。

解法二:

用map容器。头文件加入<map>。

int main(){
    clock_t start = clock();
    map<int,int> f;
    int m,n;
    int maxcnt=0, maxval;
    cin >> n;
//    n=6;
    for(int i=0; i<n; i++){
        cin >> m;
        f[m]++;
    }
    for(map<int,int>::iterator it=f.begin(); it!=f.end(); it++){
        if(maxcnt < it->second){
            maxcnt=it->second;
            maxval=it->first;
        }
        if(maxcnt == it->second){
            if( maxval < it->first)
                maxval = it->first;
        }
    }
    cout << maxval << endl;
    clock_t finish = clock();
    cout << "程序运行了" << finish-start << "毫秒" << endl;

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: