问题描述
思路
- 使用结构体,其中定义两个成员变量,一个代表整数本身,一个代表该数出现的次数。
struct node{
int pos;//记录数字
int cnt=0;//初始化出现次数
}a[maxn];
- 使用C++自带的sort()函数对结构体根据次数大小进行排序,在此需要按照题目要求自定义排序规则。
题目要求: 按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
bool cmp_cnt(node a,node b)
{
if(a.cnt == b.cnt)
return a.pos < b.pos;
return a.cnt > b.cnt;
}
关于sort()函数可以参考这篇博客:sort()函数
- 使用数组 vis[] 对已经出现过的数进行标记,从而统计不重复的数的个数。
完整代码
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1010;
int vis[maxn] = {0};
struct node{
int pos;//记录数字
int cnt=0;//初始化出现次数
}a[maxn];
bool cmp_cnt(node a,node b)
{
if(a.cnt == b.cnt)
return a.pos < b.pos;
return a.cnt > b.cnt;
}
int main(){
int i, n, x;
int sum = 0; //统计有多少个不重复的个数
cin >> n;
for(i=0;i<n;i++)
{
cin >> x;
if(vis[x]==0)
{
sum++;
vis[x]=1;
}
a[x].pos=x;
a[x].cnt++;
}
sort(a, a+maxn, cmp_cnt);
for( i = 0; i < sum; i++){
cout << a[i].pos << ' ' << a[i].cnt << endl;
}
return 0;
}