问题描述

给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。

输入格式

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

输出格式

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

样例输入

6
10 1 10 20 30 20

样例输出

10

解题思路

用一个升序的集合保存出现次数相同的数。每当有出现次数更多的数,将集合清空,并将当前的数加入。最后集合的第一个元素即为所求解。

参考代码

#include<iostream>
#include<set>
using namespace std;
int a[10005];//存储输入数据
int b[10005];//存储每个数的个数 
int n = 0, maxx = 0;
set<int, less<int> > s;//集合排序从大到小 
int main()
{
    cin >> n;
    for (int i =0; i < n; i++)
    {
        cin >> a[i];
        b[a[i]] ++;
    } 
    for (int i =1 ; i <= 10000; i++)
    {
        if (b[i] > maxx) {
            maxx = b[i]; 
            s.clear();//清空集合原有的数,保存出现次数更多的数 
            s.insert(i);
        }
        if (b[i] == maxx) {//相同出现次数,加入集合 
            s.insert(i);
        }
    }
    cout << *s.begin();
    return 0;
 } 

更简便方法

不用集合。从头到尾遍历数组b找到的第一个出现次数最大的数即为所求答案。因为是按数字升序遍历,即使后面有出现次数相同的数,最小数的也是最先出现的那一个。


算法题      CCF-CSP

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

CSP201312 2ISBN号码 上一篇
CSP201312 5Iamstuck! 下一篇