【算法练习】(8)众数

题目描述

输入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,最后对统计数组进行排序
*/

猜你喜欢

转载自blog.csdn.net/qq_24734285/article/details/79422119