CCF-201312-1-出現次數最多的數
阿新 • • 發佈:2019-01-02
試題編號: | 201312-1 |
---|---|
試題名稱: | 出現次數最多的數 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: | 問題描述 給定n個正整數,找出它們中出現次數最多的數。如果這樣的數有多個,請輸出其中最小的一個。輸入格式 輸入的第一行只有一個正整數n(1 ≤ n ≤ 1000),表示數字的個數。 輸入的第二行有n個整數s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相鄰的數用空格分隔。輸出格式 輸出這n個次數中出現次數最多的數。如果這樣的數有多個,輸出其中最小的一個。樣例輸入6 10 1 10 20 30 20樣例輸出10 |
思路分析:
其實最主要的就是統計數字出現的次數,每次新輸入的數字都和前面儲存的數字進行比較,如果已經存在,那麼對應的數字的times加一,最後比較每個數字的times,在times相同的情況下比較數字的大小。
程式碼:
#include<iostream> using namespace std; int main() { typedef struct { int number;//儲存數字 int times;//記錄數字出現的次數 } Data; typedef struct { Data data[1001]; int listlen; } SL;//存放數字 SL sllist; sllist.listlen = 0;//初始化陣列 int n, outt, outn; cin >> n;//輸入數字個數n for (int i = 0; i < n; i++) { cin >> sllist.data[i].number; sllist.data[i].times = 1; sllist.listlen++; //當輸入數字個數大於1時,每輸入一個新數字,都依次與陣列中的每一個數字進行比較,如果是出現過的數字,那麼該數字的每一個儲存位置對應的次數加1 示例見後面結果 if (i >= 1) { for (int j = i - 1; j >= 0; j--) { if (sllist.data[i].number == sllist.data[j].number) { sllist.data[j].times++; } } } } outn = sllist.data[0].number; outt = sllist.data[0].times; //比較判斷找出出現次數最多同時最小的數字 for (int k = 1; k <= sllist.listlen; k++) { if (sllist.data[k].times >= outt) { if(sllist.data[k].times > outt){ outt=sllist.data[k].times; outn = sllist.data[k].number; } if (sllist.data[k].times == outt && sllist.data[k].number < outn) { outn = sllist.data[k].number; outt=sllist.data[k].times; } } } cout<<outn; return 0; }
計數的方式:
最後得分:
其實我還是不是很明白為什麼測試結果錯誤,在自己的Clion編譯環境中測試結果完全OK,希望大家多多指教。
後面去看了下其他的答案,確實更加科學和有效,官方給出的參考答案用到了map,因為數字範圍較小,可以只利用一個數組Arr[],輸入數字m,則對應Arr[m]++;Arr[m]的值就是對應數字m出現的次數,當次數相同時,因為按照迴圈是從0開始依次比較,所以這時返回的最小值為對應陣列Arr[m]的序號m,不用進行更改和替換。
程式碼如下:
#include <iostream> #include <map> using namespace std; int main() { int n; cin >> n; map<int, int> f; for (int i = 0; i < n; i++){ int t; cin >> t; f[t]++; } int ans, m = 0; for (map<int, int>::iterator it = f.begin(); it != f.end(); it++) { if (it->second > m) { m = it ->second; ans = it ->first; } } cout << ans << endl; return 0; }