小明最近在上数学课,老师给小明布置了个作业:在 n个数里找出所有的众数。 众数的定义是这样的:在所有数当中出现次数最多的数被称为众数。并且根据定义,众 数有可能有多个。 你能解决这个问题吗? 输入格式 第一行一个整数n。 第二行有n个整数,ai表示第i个数。 40%的数据,1<=n<=400 100%的数据,1<=n<=1000000,1<=ai<=1000000000 输出格式 输出一行,包括一个整数k,表示众数的个数。 接下来一行包括k 个整数,每个整数都表示一个众数,并且从小到大输出。 输入格式 第一行一个整数n。 第二行有n个整数,ai表示第i个数。 40%的数据,1<=n<=400 100%的数据,1<=n<=1000000,1<=ai<=1000000000 输入: 10 3 3 3 2 3 1 2 2 1 2 输出: 2 2 3 浅说:这道题想了好久,想不出来,最后参考了大佬的题解,写的非常好,膜拜大佬~ 大家有没有什么更好的解题方法呢~
using namespace std;
long long arr1[1000005],arr2[100005];
int main()
{
int n=0,m=0,a=0,b=0,c=0;
//m:用于记录最终找到的众数的个数,初始化为 0
//a:用于在遍历数组 arr1时,统计当前数字连续出现的次数,初始化为 0
//b:用于记录到目前为止出现次数最多的数字的出现次数,初始化为 0
//c:临时变量
cin>>n;
for(int i=0;i<n;i++){
cin>>arr1[i];
}
sort(arr1,arr1+n);
for(int i = 0;i < n;i++){
if(c != arr1[i]){
c = arr1[i];
a = 0;
}else{
a++;
}
if(a > b){
b = a;
m = 0; //重点
}
if(c == arr1[i] && a == b){
arr2[m++] = arr1[i];
}
}
cout<<m<<endl;
for(int i = 0;i < m;i++){
cout<<arr2[i]<<' ';
}
return 0;
}