题目
问题描述
给定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>
using namespace std;
int main(int argc, char *argv[]) {
int num,i,max=0,maxi=0;
int a[10001];
for(i=0;i<10001;i++)
a[i]=0;
cin>>num;
while(num--)
{
cin>>i;
a[i]++;
}
for(i=10000;i>0;i--)
if(a[i]>=max)
{
max=a[i];
maxi=i;
}
cout<<maxi;
return 0;
}
我的思路
用数组下标表示输入的值,数组值表示该值出现的次数,所以在输入时就可以实时统计该值出现的次数,然后对数组进行从后向前扫描,不断刷新最大次数和对应的值,同时自动解决了取相同次数最小值的问题
参考答案及注释解析
#include <iostream>
# include <cstdio>
# include <string>
# include <vector>
# include <deque>
# include <list>
# include <map>
using namespace std;
int main() {
int n;
cin >> n;
map<int, int> f;//申请map<int,int>,默认初始化为0,对基本类型的key以降序排列
for ( int i = 0; i < n; i++ ) {
int t;
cin >> t;
f[t]++;//统计次数
}
int ans, m = 0;
for ( map<int, int>::iterator it = f.begin(); it != f.end(); it++ ) {
if ( it->second > m ) {
m = it->second;
ans = it->first;//寻找最大次数,同时key的默认排序实现了同次数取小
}
}
cout << ans << endl;//输出出现最大次数的值
return(0);
}