考研机试:数学问题之众数

版权声明:本博全为博主学习日常,均为原创,请勿转载 https://blog.csdn.net/weixin_44332298/article/details/87544527

题目描述

给定一个长度为N的非降数列,求数列中出现次数最多的数。
如果答案不唯一,输出其中最小的数。

输入格式

输入数据第一行是一个整数T(1 <= T <= 100),表示测试数据的组数。
对于每组测试数据:
第一行是一个正整数N(1 <= N <= 100),表示数列长度。
第二行有N个整数,整数用空格隔开,所有整数都不超过105,表示这个数列。

输出格式

对于每组测试数据,输出一个整数。

输入样例

2
4
1 1 1 2
5
1 1 2 2 3

输出样例

1
1

题目分析

1、关于数组的构建
普通数组:
数组 1 1 1 2
下标 0 1 2 3
计数数组:
数组 0 3 1 0…
下标 0 1 2 3…

运用哈希思想,在数组中直接记录元素出现的次数

2、数组初始化
memset(a, 0, sizeof(a));//将数组a初始化为0,第三个参数为数组a的长度
包含在<string.h>头文件中
数组初始化应该放在while循环中,每次对数组操作前都要初始化为0。

3、题目中有多组输入测试数据,用while循环控制。
C:while(scanf("%d", &n) != EOF){…}
C++:while(cin >> n){…}**

注*:题目中对数组长度的要求是105,定义数组的时候可以稍微开的大一点 int a[100005];

代码

#include <iostream>
#include <string.h>
using namespace std;

int main(){
    int T, N, max,tmp,num;
    int a[100005];

    cin >> T;
    while(T--){
        cin >> N;
        memset(a, 0, sizeof(a));//数组初始化为0
        /*
        for(int i = 0; i<100005; i++){
            a[i] = 0;
        }
        */
        for(int i = 0; i<N; i++){
            cin >> num;
            a[num] = a[num] + 1;
        }
        max = 0;//初始化
        for(int j = 0; j<100005; j++){
            if(a[j] > max){
                max = a[j];
                tmp = j;
            }
        }
        cout << tmp << endl;
    }
    return 0;
}

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44332298/article/details/87544527