1. 程式人生 > >CCF-201312-1-出現次數最多的數

CCF-201312-1-出現次數最多的數

問題描述
試題編號: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;
}