【蓝桥杯】map的排序

蒜头君来蒜厂面试的时候,曾经遇到这样一个面试题:

给定 nn 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一个。当时可算是给蒜头君难住了。现在蒜头君来考考你。

输入格式

第一行输入一个整数 n(1 \le n \le 100000)n(1n100000),接下来一行输入 nn 个 int 范围内的整数。

输出格式

输出出现次数最多的数和出现的次数,中间用一个空格隔开,如果有多个重复出现的数,输出值最大的那个。

样例输入1
5
1 1 2 3 4
样例输出1
1 2
样例输入2
10
9 10 27 4 9 10 3 1 2 6
样例输出2
10 2

#include<iostream>
#include<map>
#include<bits/stdc++.h>
using namespace std;

bool cmp(pair<int,int>&a,pair<int,int>&b)   //①自定义计算机的"小于" 
{
    if(a.second>b.second)
        return true;
    else if(a.second==b.second && a.first>b.first)
        return true;
    else
        return false;     //这个else语句一定不能漏掉
}

int main()
{
    map<int,int> m;
    int n;
    cin>>n;
    while(n--)
    {
        int a;
        cin>>a;
        if(m.count(a)==0) m[a]=0;   //②
        m[a]++;
    }
    vector<pair<int,int>>vec(m.begin(),m.end());      //③
    sort(vec.begin(),vec.end(),cmp);
    cout<<vec.begin()->first<<" "<<vec.begin()->second;
    return 0;
}

学到的点:

①根据题意,我们想要使用sort函数,但默认的sort函数是“less”的(即从小到大排序),对于元组pair来说就是默认根据key值从小到大排序的。于是我们需要告诉计算机,计算机默认的“小于”应该是我认为的“大于”,见代码。

②map计数的方法。

③一定要注意,

第一反应是利用stl中提供的sort算法实现,这个想法是好的,不幸的是,sort算法有个限制,利用sort算法只能对序列容器进行排序,就是线性的(如vector,list,deque)。map也是一个集合容器,它里面存储的元素是pair,但是它不是线性存储的(前面提过,像红黑树),所以利用sort不能直接和map结合进行排序。

       虽然不能直接用sort对map进行排序,那么我们可不可以迂回一下,把map中的元素放到序列容器(如vector)中,然后再对这些元素进行排序呢?这个想法看似是可行的。要对序列容器中的元素进行排序,也有个必要条件:就是容器中的元素必须是可比较的,也就是实现了<操作的。


两个参考链接,写得都让我有所收获:

https://www.cnblogs.com/zhouxiaosong/p/5557990.html

http://blog.csdn.net/acidgl8757/article/details/17416439

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值