题目描述
给定 n 个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入格式
输入的第一行包含一个整数 n,表示给定数字的个数。
第二行包含 n 个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出格式
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。
按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
数据范围
$1≤n≤1000$
给出的数都是不超过 1000 的非负整数。
输入样例:
12
5 2 3 3 1 3 4 2 5 2 3 5
输出样例:
3 4
2 3
5 3
1 1
4 1
思路
这题涉及到记录每个数出现的次数,所以要用哈希表
因为范围较小,所以用数组代替就行了
还涉及到排序,比较好用的方法就是重载运算符
题目怎么描述的就怎么重载
另外,在输出的时候,循环是到n停止
此时的n代表的是去重后一共有多少个数(因为在存储的时候清了0)
如果要用另外的变量进行存储的话,循环也要改成相应的变量
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
int n;
int cnt[N];
struct Data
{
int v,c;
bool operator<(const Data& t) const
{
if (c!=t.c) return c>t.c;
return v<t.v;
}
}q[N];
int main()
{
cin >> n;
while (n--)
{
int x;
cin >> x;
cnt[x]++;
}
n=0;
for (int i = 0 ; i < N ; i ++)
{
if (cnt[i])
q[n++] = {i,cnt[i]};
}
sort(q,q+n);
for (int i = 0 ; i < n;i ++)
cout<<q[i].v<<' '<<q[i].c<<endl;
return 0;
}