前幾天知道的CCF計算機職業資格認證考試,覺得好像比軟考含金量高一些,就去了解了一下,做了模擬試題中的 “出現次數最多的數” 這道題,我的算法和官方答案算法不同,個人覺得覺得官方的好一點,沒那么繁瑣,就是可能第一眼看過去覺得有些難理解,我會在下面做一個官方答案的解析,最后也會放上自己的代碼。
做模擬試題要先登錄官網:https://passport.ccf.org.cn/sso/platform,CSP認證 報名考試→模擬考試(建議用電腦打開,手機看不到模擬考試)
模擬試題的答案可以直接在官網下載

題目如下:
輸入的第二行有n個整數s 1, s 2, …, s n (1 ≤ s i ≤ 10000, 1 ≤ i ≤ n)。相鄰的數用空格分隔。
10 1 10 20 30 20
官方正確代碼及解析:
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的模擬試題,也會在后面的博客里寫出。
