问题描述
试题编号: | 201312-1 |
试题名称: | 出现次数最多的数 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。 输出格式 输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。 样例输入 6 样例输出 10 |
方法一:
思路
- 输入的同时看是否与前面的输入相同,相同的话直接对前面那个数字的出现++即可。
- 调用sort()函数对结构体进行二级排序。
代码
#include<iostream>
#include<algorithm>
using namespace std;
struct number{
int num; //数字
int time; //该数字出现的次数
}v[1001];
bool cmp (const struct number &a,const struct number &b)
{
if(a.time!=b.time)
return a.time>b.time; //次数由大到小
else
return a.num<b.num; //次数相同的,数字由小到大
}
int main()
{
int n,i,b;
cin>>n;
for(i=0,b=0;b<n;i++,b++)
{
int a,k,flag=0;
cin>>a;
for(k=0;k<i;k++)
{
if(v[k].num==a)
{
v[k].time++;
flag=1;
break;
}
}
if(flag)
i--; //数字相同的,当前i对应的数组没有使用,因为后面有i++,所以先提前i--
else
{
v[i].num=a; //遍历后没发现相同的数字则加入v数组中
v[i].time=1;
}
}
sort(v,v+i,cmp);
cout<<v[0].num<<endl;
/*
for(int j=0;j<i;j++)
cout<<v[j].num<<'\t'<<v[j].time<<endl;
*/
return 0;
}
方法二:
思路
利用 map 容器实现
代码
#include<iostream>
#include<map>
using namespace std;
int main()
{
int n,a;
cin>>n;
map<int,int>m;
for(int i=0;i<n;i++)
{
cin>>a;
m[a]++;
}
int ans=0,count=0; //ans 表示数字 count 表示出现次数
for(map<int,int>::iterator it=m.begin();it!=m.end();it++) //使用迭代器进行遍历
{
if(it->second>count) //因 map 容器有序,所以遍历时数字是由小到大的,只需找出比当前count大的即可
{
ans=it->first;
count=it->second;
}
}
cout<<ans<<endl;
return 0;
}