给定 n 个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出。
输入输出格式
输入的第一行包含一个整数 n,表示给定数字的个数。第二行包含 n 个整数,相邻的整数之间用一个空格分隔,表示所给定的整数。
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则先输出值较小的,然后输出值较大的。
数据规模
1 ≤ n ≤ 1000 1\le n\le 10001≤n≤1000,给出的数都是不超过 1000 的非负整数。
算法设计
题目比较简单,先用 unordered_map 将遇到的数字及其出现次数储存起来,然后将 unordered_map 中所有元素搬迁到 vector 中,对 vector 按要求排序输出即可。
代码:
#include <map>
#include <iostream>
#include <string>
#include<algorithm>
using namespace std;
#define MAX 1005
int a[MAX]={0};
int b[MAX]={0};
int main(){
int n;
while(cin>>n){
int max=0;
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=1;
}
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){
if(a[i]>a[j])
swap(a[i],a[j]);
}
for(int i=1;i<n;i++){
if(a[i]==a[i-1]){
b[i]=b[i-1]+1;
b[i-1]=0;
}
}
for(int i=0;i<n;i++){
if(b[i]>max){
max=b[i];
}
}
for(int i=max;i>=1;i--)
for(int j=0;j<n;j++){
if(i==b[j]){
cout<<a[j]<<" "<<i<<endl;
}
}
}
}