【演算法練習】(8)眾數

遊走走發表於2018-03-02

題目描述

輸入20個數,每個數都在1-10之間,求1-10中的眾數(眾數就是出現次數最多的數,如果存在一樣多次數的眾數,則輸出權值較小的那一個)。

輸入描述:

測試資料有多組,每組輸入20個1-10之間的數。
輸出描述:
對於每組輸入,請輸出1-10中的眾數。

示例1
輸入

5 1 5 10 3 5 3 4 8 6 8 3 6 5 10 7 10 2 6 2

輸出

5

程式碼實現:

#include<iostream>
using namespace std;
int main(){
    int e,arr[20],count[20],record[20],i=0,j=0;
    // 初始化 e為輸入元素,arr儲存20個輸入,count儲存每個元素的計數值,record儲存每個元素的值,i用於記錄當前輸入元素個數,20個後清零,j記錄元素種類的個數,與i同時清零
    for(int k=0;k<20;k++){
        arr[k]=0;
        count[k]=0;
        record[k]=0;
    }// 初始化陣列
    while(cin>>e){
        if(e>=1 && e<=10){//當輸入元素滿足條件時,計入陣列
            arr[i]=e;
            if(j==0){//第一個計數元素,直接儲存
                record[j]=e;
                count[j]++;
                j++;
            }else{
                int k=0,flag=false;;
                for(;k<j;k++){//對比計數陣列中的元素,若有相同,則計數值+1;
                    if(record[k]==e){
                        count[k]+=1;
                        flag=true;
                        break;
                    }
                }
                if(!flag){//若計數陣列中未有該元素,則新增儲存
                    record[j]=e;
                    count[j]++;
                    j++;
                }
            }
            i++;
        }
        if(i==20){
            // 滿20個就輸出眾數
            int max=count[0],num=record[0];// max為最多的次數,num儲存對應眾數
            for(int k=0;k<j;k++){
//                cout<<record[k]<<":"<<count[k]<<endl;
                if(count[k]==max && record[k]<num)// 如果出現次數相同,則儲存權值小的
                    num=record[k];
                else if(count[k]>max){//如果次數大於當前記錄,則更新
                    max=count[k];
                    num=record[k];
                }
            }
            cout<<num;//輸出眾數
            // clear
            i=0;j=0;
            for(int k=0;k<20;k++){
                arr[k]=0;
                count[k]=0;
                record[k]=0;
            }
        }
    }
    return 0;
}

/*
 解題思路:
 每輸入一個數,就與統計陣列中的數字一一對比,如果陣列中沒有,就新增,如果有計數值就+1,最後對統計陣列進行排序
*/

相關文章