问题描述:
给定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
解决思想:
自定义重载比较运算符!!!(类似于java中的compareTo)
AC代码(c++):
#include<bits/stdc++.h>
using namespace std;
struct Node{
int key;
int value;
Node(int k,int v){
key=k;
value=v;
}
bool operator<(const Node &s){ //重载运算符
if(value==s.value){
return key<s.key; //升序
}
return value>s.value; //降序
}
};
int main(){
int n;
int temp;
cin>>n;
map<int,int> mp;
for(int i=0;i<n;i++){
cin>>temp;
mp[temp]++;
}
map<int,int>::iterator it;
vector<Node> v;
for(it=mp.begin();it!=mp.end();it++){
Node node=Node(it->first,it->second);
v.push_back(node);
}
sort(v.begin(),v.end()); //调用
//输出
vector<Node>::iterator it_one;
for(it_one=v.begin();it_one!=v.end();++it_one){
cout<<(*it_one).key<<" "<<(*it_one).value<<endl;
}
return 0;
}