数字排序问题
问题描述
给定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方法来进行排序。
本题的讲解到此,谢谢!