【问题描述】
给定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 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); } }
int main() { int n, pos = 0; Pair pair[N]; cin >> n;
initial(pair, n, pos); sort(pair, pair + pos, cmp_fre); out(pair, pos);
return 0; }
|
如果有更好的写法欢迎在评论区给出噢^_^