1. 程式人生 > >CCF 模擬試題——出現次數最多的數 官方答案解析及自己寫的正確答案

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的模擬試題,也會在後面的部落格裡寫出。