• 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 class Main {
     3     public static void main(String[] args) {
     4         new Main().run();  //调用Main类中的run()函数
     5     }
     6     public void run() {
     7         Scanner fin = new Scanner(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 import java.util.Scanner;
     2 public class Main {
     3 
     4     public static void main(String[] args) {
     5         Scanner sc = new Scanner(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的模拟试题,也会在后面的博客里写出。

  • 相关阅读:
    ubuntu升级显卡驱动
    __slots__属性,声明实力属性名字列表
    isinstance 与 type 的区别
    conda使用技巧
    卷积神经网络参数
    apache nginx php不显示版本号
    30个实用的Linux find命令示例
    账号的管理的那点事
    Linux 命令整理 —— 基本操作
    Linux 命令整理 —— 用户管理
  • 原文地址:https://www.cnblogs.com/mulin1999/p/11531049.html
Copyright © 2020-2023  润新知