CCF 模擬試題——出現次數最多的數 官方答案解析及自己寫的正確答案
阿新 • • 發佈:2019-09-17
前幾天知道的CCF計算機職業資格認證考試,覺得好像比軟考含金量高一些,就去了解了一下,做了模擬試題中的 “出現次數最多的數” 這道題,我的演算法和官方答案演算法不同,個人覺得覺得官方的好一點,沒那麼繁瑣,就是可能第一眼看過去覺得有些難理解,我會在下面做一個官方答案的解析,最後也會放上自己的程式碼。
做模擬試題要先登入官網:https://passport.ccf.org.cn/sso/platform,CSP認證 報名考試→模擬考試(建議用電腦開啟,手機看不到模擬考試)
模擬試題的答案可以直接在官網下載
題目如下:
問題描述 給定n個正整數,找出它們中出現次數最多的數。如果這樣的數有多個,請輸出其中最小的一個。 輸入格式 輸入的第一行只有一個正整數n(1 ≤ n ≤ 1000),表示數字的個數。輸入的第二行有n個整數s1
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的模擬試題,也會在後面的部落格裡寫出。