版权声明:本博全为博主学习日常,均为原创,请勿转载 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;
}