python试题出现次数最多的数答案_CCF 模拟试题——出现次数最多的数 官方答案解析及自己写的正确答案...

前几天知道的CCF计算机职业资格认证考试,觉得好像比软考含金量高一些,就去了解了一下,做了模拟试题中的 “出现次数最多的数” 这道题,我的算法和官方答案算法不同,个人觉得觉得官方的好一点,没那么繁琐,就是可能第一眼看过去觉得有些难理解,我会在下面做一个官方答案的解析,最后也会放上自己的代码。

做模拟试题要先登录官网:https://passport.ccf.org.cn/sso/platform,CSP认证 报名考试→模拟考试(建议用电脑打开,手机看不到模拟考试)

模拟试题的答案可以直接在官网下载

题目如下:

问题描述

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

输入格式

输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。

输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。

输出格式

输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。

样例输入

6

10 1 10 20 30 20

样例输出

10

官方正确代码及解析:

1 import java.util.*;2 public classMain {3 public static voidmain(String[] args) {4 new Main().run(); //调用Main类中的run()函数

5 }6 public voidrun() {7 Scanner fin = newScanner(System.in);8 int N =fin.nextInt();9 int[] count = new int[10001]; //创建一个长度为10001的数组count

10 for (int i = 0; i < N; ++i)11 {12 ++count[fin.nextInt()]; //设置一个循环,将我们输入的整数作为数组的下标,对该下标数的元素里的数加一

13 }14 int maxCount = -1; //设置一个记录次数的标识符

15 int result = 0; //设置一个记录当前出现最多次的数的标识符

16 for (int i = 1; i <= 10000; ++i)17 {18 if (count[i] > maxCount) //遍历count数组,如果当前元素记录次数大于maxCount,就将当前元素记录的次数以及下标存在maxCount和result里

19 {20 maxCount =count[i];21 result =i;22 }23 }24 System.out.println(result); //最后输出出现最多的数

25 }26 }

10-13行这段代码用输入的数作为count数组元素的下标,每输入一个数,就将以该数为下标的count数组元素里的数加一,而java中int数组类型的默认值为0,举一个例子:

现在n=5,要输入的整数分别为12,34,2,12,4。则系统的操作为:++count[12],++count[34],++count[2],,++count[12],,++count[4],

所以count[12]=2,count[34]=1,count[2]=1,count[4]=1,而没有输入的数则是:count[45]=0,count[265]=0,count[8]=0……

最后只用遍历一遍count数组就可以比较出出现最多次数的数,而且,遍历是从小向大遍历,当两个数出现次数一样时,不会采取任何操作,标识数里存的还是小的数。

下面是我自己的正确代码:

1 importjava.util.Scanner;2 public classMain {3

4 public static voidmain(String[] args) {5 Scanner sc = newScanner(System.in);6 int n =sc.nextInt();7 int s[]=new int[n+1];8 for(int i=1;i<=n;i++)9 {10 s[i]=sc.nextInt();11 }12 int temp=0;13 int mesure=1;14 int max=s[1];15 int sum=0;16 for(int i=1;i<=n;i++)17 {18 temp=s[i];19 for(int j=i+1;j<=n;j++)20 {21 if(s[j]==temp)22 mesure++;23 }24 if(mesure>sum)25 {26 max=s[i];27 sum=mesure;28 }29 else if(mesure==sum)30 {31 if(max>s[i])32 max=s[i];33 }34 mesure=1;35 }36 System.out.println(max);37 }38 }

我直接将输入的数按顺序存在了数组里,再用的双重循环,判断出出现次数最多的数,开始只有90分,后来发现问题后调通拿了100分。

我后面会继续做ccf的模拟试题,也会在后面的博客里写出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值