自定义数字排序(C++)

问题描述:
给定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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值