CCF 模拟试题——出现次数最多的数 官方答案解析及自己写的正确答案
2019-09-16 23:40
1356 查看
前几天知道的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
官方正确代码及解析:
import java.util.*; public class Main { public static void main(String[] args) { new Main().run(); //调用Main类中的run()函数 } public void run() { Scanner fin = new Scanner(System.in); int N = fin.nextInt(); int[] count = new int[10001]; //创建一个长度为10001的数组count for (int i = 0; i < N; ++i) { ++count[fin.nextInt()]; //设置一个循环,将我们输入的整数作为数组的下标,对该下标数的元素里的数加一 } int maxCount = -1; //设置一个记录次数的标识符 int result = 0; //设置一个记录当前出现最多次的数的标识符 for (int i = 1; i <= 10000; ++i) { if (count[i] > maxCount) //遍历count数组,如果当前元素记录次数大于maxCount,就将当前元素记录的次数以及下标存在maxCount和result里 { maxCount = count[i]; result = i; } } System.out.println(result); //最后输出出现最多的数 } }
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数组就可以比较出出现最多次数的数,而且,遍历是从小向大遍历,当两个数出现次数一样时,不会采取任何操作,标识数里存的还是小的数。
下面是我自己的正确代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int s[]=new int[n+1]; for(int i=1;i<=n;i++) { s[i]=sc.nextInt(); } int temp=0; int mesure=1; int max=s[1]; int sum=0; for(int i=1;i<=n;i++) { temp=s[i]; for(int j=i+1;j<=n;j++) { if(s[j]==temp) 1a14 mesure++; } if(mesure>sum) { max=s[i]; sum=mesure; } else if(mesure==sum) { if(max>s[i]) max=s[i]; } mesure=1; } System.out.println(max); } }
我直接将输入的数按顺序存在了数组里,再用的双重循环,判断出出现次数最多的数,开始只有90分,后来发现问题后调通拿了100分。
我后面会继续做ccf的模拟试题,也会在后面的博客里写出。
相关文章推荐
- CCF计算机软件能力认证模拟试题-出现次数最多的数(Java参考答案学习记录)
- CCF计算机软件能力认证模拟试题-出现次数最多的数(Java参考答案学习记录)
- ccf试题201312-1——出现次数最多的数
- CCF 历年真题之出现次数最多的数(_1312_1_TheHighestNumberOfOccurrences.java)参考答案
- CCF-CAP 201312-1 出现次数最多的数 答案
- 201312-1出现次数最多的数——CCF计算机软件能力认证试题历届真题
- ccf试题 出现次数最多的数
- CCF CSP 编程题目和解答-----试题名称: 出现次数最多的数 --------201312-1
- CCF计算机软件能力认证试题练习201312-1-出现次数最多的数
- CCF认证模拟之出现次数最多的数
- CCF-出现次数最多的数-201312-1
- poj 1743 后缀数组+二分答案 求一个串的最长无重叠的重复出现次数最多的子串
- CCF CSP真题 出现次数最多的数 题解
- 试题名称: 出现次数最多的数 已ac
- 2014华为机试题——取出整型数据中出现次数最多的元素,并按照升序排列返回
- CCF-201312-1-出现次数最多的数
- CCFCSP 201312-1出现次数最多的数
- CCF CSP 求出现次数最多的值
- CCF CSP 201312-1 出现次数最多的数
- CCF 201312-1 出现次数最多的数