上面是题目,下面是代码和注释。map的中文名叫映射,存放数量可变的数据对,key与value,其类型可以自由定义。这道题看似很简单,但是由于题意中的数据范围实在太大了,不适合开数组来解,适合大小可变的容器,又由于每个数有两个值需要记录(值和出现的次数),所以map最合适。解题思路是用map来存输入的值作为key,重复出现的次数为value,当value被定义为int型时默认初始值为0。可以象数组那样使用自增来计数,也可以用inser()函数插入。但是用inser()函数更新之前,需要调用erase()函数擦除之前的数据对,否则更新不了。这个是我调了很久bug才发现的,多么痛的领悟。最后把map按照value的值降序排序,可是map是默认按照key升序排序,map也传不进sort()中去,只能开个vector数组装进去,再排序,其他博客关于map按照value排序的方法也大多是用vector装map再排序。
// Practice.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(const pair<long long, long long > &p1, const pair<long long, long long> &p2)//要用常数,不然编译错误
{
return p1.second>p2.second; //为了按照value降序排列设计的cmp函数
}
int main()
{
map<long long, long long> s;
map<long long, long long>::iterator it;
long long n, temp, key, value;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> temp;
it = s.find(temp);
if (it == s.end()) {
s.insert(pair<long long, long long>(temp, 1));
}
else if (it != s.end()) {
value = s[temp];
++value;
s.erase(it); //如果已经存在,重新写入前需要先将原数据对擦出
s.insert(pair<long long, long long>(temp, value));
}
}
/*for(int i=0;i<n;i++){ //其实上面复杂的写入map的写法可与改这样简洁的数组形式
cin >> temp; //s[]默认int会初始化为0,只需要自增就可以实现计数功能了
s[temp]++;
}*/
/*for (it = s.begin(); it != s.end(); ++it) { //这是一个遍历输出map的,map默认
cout << it->first << ends << it->second<<endl; //按照key,的大小升序排列
}*/
vector<pair<long long, long long> > arr;
for (it = s.begin(); it != s.end(); ++it) //这是为了让map按照value的值
{ //排序而写的vector数组,利用迭代器遍历map
arr.push_back(make_pair(it->first, it->second)); //pair模板的特性是存first与second
}
sort(arr.begin(), arr.end(), cmp);
cout << arr.begin()->second;
return 0;
}