一、题目
题目原始链接:http://118.190.20.162/view.page?gpid=T5
二、解题
1.题目解释
1.出现次数最多的数
可以使用哈希,数组下标为输入的数字,数组里面存储的就是输入的数字的次数,这样可以一边存储数字,一边记录数字出现的次数。
2.如果这样的数有多个,请输出其中最小的一个。
因为利用上边提到的存储方法,所有元素已经**有序(从小到大)**了,此时只需要遍历一遍数组,就可以输出出现次数最多且最小的元素了。
2.代码
dev c++ 5.11
#include<iostream>
using namespace std;
int a[10010];
int main(){
int n;
cin>>n;
int x;
//存储的同时记录数字出现的次数
for(int i=0;i<n;i++){
cin>>x;
a[x]++;
}
int res,max=0;
for(int i=0;i<10010;i++){
if(a[i]>max && a[i]!=0){//大于保证了次数相同的多个中取最小
max=a[i];
res=i;
}
}
cout<<res;
return 0;
}
3.提交结果
三、总结
1.代码思路:
这是一段用于求解出现次数最多的数的代码,实现思路比较简单。
具体实现方式:
-
读入输入数据
n
。 -
定义一个长度为10010的整型数组
a
,记录每个数出现的次数。 -
依次读入
n
个数并记录其出现的次数。对于每个读入的数,将其作为下标访问数组a
,并将对应的计数器加1。 -
定义两个变量
res
和max
,分别用来记录出现次数最多的数和其出现的次数的最大值。 -
通过遍历数组
a
,找到出现次数最多的数。具体实现方式是对于数组中每个不为0的数,如果其对应的计数器值大于当前的最大值max
,则将res
更新为该数的下标值,将max
更新为该数的计数器值。 -
输出出现次数最多的数
res
。
该算法的时间复杂度为O(n+m),其中n为读入的数的个数,m为不同的数的个数。因为需要遍历数组a
,数组的长度是10010,因此可以认为该算法的时间复杂度是O(1)。
2.其他:
- 建议在定义较大数组(如文中a[1010])为全局变量,一是C语言中,全局变量不初始化默认为0,二是局部区域开辟数组利用的是栈空间,可能会有爆栈的风险。
if(a[i]>max && a[i]!=0)
只能是大于,不能是不小于,否则无法保证第二个要求。- 注意输入格式:
第一行:n(1 ≤ n ≤ 1000),所以开辟的数组稍大于1010即可;
第二行:(1 ≤ si ≤ 10000, 1 ≤ i ≤ n),遍历的次数应该稍大于10000 。