【CCF-CSP】201312-1 出现次数最多的数 C++

一、题目

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

题目原始链接: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.代码思路:

这是一段用于求解出现次数最多的数的代码,实现思路比较简单。

具体实现方式:

  1. 读入输入数据n

  2. 定义一个长度为10010的整型数组a,记录每个数出现的次数。

  3. 依次读入n个数并记录其出现的次数。对于每个读入的数,将其作为下标访问数组a,并将对应的计数器加1。

  4. 定义两个变量resmax,分别用来记录出现次数最多的数和其出现的次数的最大值。

  5. 通过遍历数组a,找到出现次数最多的数。具体实现方式是对于数组中每个不为0的数,如果其对应的计数器值大于当前的最大值max,则将res更新为该数的下标值,将max更新为该数的计数器值。

  6. 输出出现次数最多的数res

该算法的时间复杂度为O(n+m),其中n为读入的数的个数,m为不同的数的个数。因为需要遍历数组a,数组的长度是10010,因此可以认为该算法的时间复杂度是O(1)。

2.其他:

  1. 建议在定义较大数组(如文中a[1010])为全局变量,一是C语言中,全局变量不初始化默认为0,二是局部区域开辟数组利用的是栈空间,可能会有爆栈的风险。
  2. if(a[i]>max && a[i]!=0) 只能是大于,不能是不小于,否则无法保证第二个要求。
  3. 注意输入格式:
    第一行:n(1 ≤ n ≤ 1000),所以开辟的数组稍大于1010即可;
    第二行:(1 ≤ si ≤ 10000, 1 ≤ i ≤ n),遍历的次数应该稍大于10000 。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值