Halo

A magic place for coding

0%

CCF--数字排序

数字排序问题

问题描述

 给定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的非负整数。

解决方法

分析

 这是一个很经典的统计数字出现次数的问题,首先我们想到的传统做法是使用map。我们可以把key设为是数字,对应的value设置为对应的出现次数,这样做是很方便的。但是在本题中,输出格式的顺序不仅与key有关,还与value有关,因此上述方法就很不方便了。
 我选择了一种自定义的方法,自己定义一个新的类Pair,并根据题目意思重新定义它的排序规则,从而让我能够直接使用< algorithm >**算法库中的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
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct Pair {
int key;
int value;

Pair(int _key, int _value) {
key = _key;
value = _value;
}

bool operator<(const Pair& other) const {
if (value < other.value)
return true;
else if (value == other.value && key > other.key)
return true;

return false;
}
};

int main() {
int n;
cin >> n;
int size = n;
std::vector<Pair> v;

while (n--) {
int key;
cin >> key;

bool isFound = false;
for (int i = 0; i < v.size(); i++) {
if (v[i].key == key) {
v[i].value++;
isFound = true;
break;
}
}
if (!isFound) {
v.push_back(Pair(key, 1));
}
}

sort(v.begin(), v.end());
for (int i = v.size() - 1; i >= 0; i--) {
cout << v[i].key << " " << v[i].value << endl;
}
return 0;
}

 这题也给我展示了一个很常见的编程思路,在我们需要对object分先后的时候,可以通过定义它的大小关系,再通过调用sort方法来进行排序。
 本题的讲解到此,谢谢!

Welcome to my other publishing channels