题目描述
给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。
第一行输入n(n<=1000),第二行输入n个数(每个数<=10000),相邻的数用空格分隔。
思路分析
a作为输入的数组,对a进行遍历。a中的值存储在b,c数组的地址下标,每个值出现的次数存储在b,c数组的内容值。
对c数组(工具数组)排序,求出最大次数max。
对数组b进行遍历,如果等于max,则输出其下标。
break,遇到第一个次数最大值就暂停。确保有多个次数最多的数时,输出的是最小的那个。
数组a:
1 | 2 | 1 | 3 | 5 |
---|---|---|---|---|
0 | 1 | 2 | 3 | 4 |
数组b:
0 | 2 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 |
数组c:
0 | 2 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 |
实现代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
int a[1000]={}; // n(输入个数)最的大值
int b[10000]={}; //输入的n个数的值的最大值
int c[10000]={}; //工具数组,下面用来求次数最大值
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;++i)
{
scanf("%d",&a[i]);
b[a[i]]++; //地址下标表示数。内容值表示出现次数
c[a[i]]++; //同上
}
sort(c,c+10000); //对工具数组c进行排序
int max=c[9999]; //得出次数最大值 max
for(int i=0;i<10000;++i){
if(b[i]==max){ //对b数组进行遍历,如果 内容值=max 其地址值即为所求
printf("%d\n",i);
break; //在求得第一个出现次数最多的数后,停止
}
}
}
return 0;
}