蒜头君来蒜厂面试的时候,曾经遇到这样一个面试题:
给定 nn 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一个。当时可算是给蒜头君难住了。现在蒜头君来考考你。
输入格式
第一行输入一个整数 n(1 \le n \le 100000)n(1≤n≤100000),接下来一行输入 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