问题描述
输入格式
输入的第一行只有一个正整数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找到的第一个出现次数最大的数即为所求答案。因为是按数字升序遍历,即使后面有出现次数相同的数,最小数的也是最先出现的那一个。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!