【问题描述】

  给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。

【输入形式】

  输入的第一行包含一个整数n,表示给定数字的个数。
  第二行包含n个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。

【输出形式】

  输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。

【样例输入】

  12
  5 2 3 3 1 3 4 2 5 2 3 5

【样例输出】

  3 4
  2 3
  5 3
  1 1
  4 1

【评分标准】

  评测用例规模与约定
  1 ≤ n ≤ 1000,给出的数都是不超过1000的非负整数。

思路:

(1)将每个数字与其出现频率绑定定义为Pair类,定义Pair类数组;

(2)接收输入,判断输入数字是否存在,存在则对应数字频率加一,不存在则写入数字并频率加一;

(3)sort函数自定义排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <algorithm>
#define N 1000 // 测试请将N改小
using namespace std;

class Pair
{
public:
int num = 0; // 数字
int fre = 0; // 频率
};

int inArray(int n, Pair *p, int &pos)
{
for (int i = 0; i < pos; i++)
{
if (p[i].num == n)
{
p[i].fre++;
return 1; // 该数字已存在
}
}

p[pos].num = n;
p[pos].fre++;
pos++;
return 0; // 该数字不存在
}

bool cmp_fre(Pair x, Pair y)
{
if (x.fre == y.fre)
return x.num < y.num;

return x.fre > y.fre;
}

void out(Pair *p, int n)
{
for (int i = 0; i < n; i++)
{
cout << p[i].num << ' ' << p[i].fre << endl;
}
}

void initial(Pair *p, int n, int &pos)
{
int temp;

for (int i = 0; i < n; i++)
{
cin >> temp;
inArray(temp, p, pos); // 判断读取的数字是否已经存在,pos表示当前pair数组中存放的结果总数
}
}

int main()
{
int n, pos = 0; // pos对应下一个数字存放的下标
Pair pair[N];
cin >> n; // 数字个数

initial(pair, n, pos);
sort(pair, pair + pos, cmp_fre);
out(pair, pos);

return 0;
}

如果有更好的写法欢迎在评论区给出噢^_^