题目
时间限制: 1.0s
内存限制: 256.0MB
问题描述
给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。
输入格式
输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。
输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。
输出格式
输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。
样例输入
6
10 1 10 20 30 20
样例输出
10
代码
方法一:使用map
关于map:
map是STL的一个关联容器,它提供一对一的hash。
- 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
- 第二个可能称为该关键字的值(value);
需要的头文件
#include<map>
构造map
map<数据类型1,数据类型2> map名;//其中数据类型1是key,2是value
示例
map<int,int> m
代码演示
#include<iostream>
#include<map>
using namespace std;
int main()
{
int n;
cin>>n;//输入数字的个数
map<int,int> m;//构造map
for(int i=0;i<n;i++)
{
int number;
cin>>number;
m[number]++;//在map中找到相应的数字,并且将次数+1
}
int ans,count=0;//题初始次数为0
map<int,int>::iterator it;//定义了一个名为it的变量 (iterator是一个检查容器内元素并遍历元素的数据类型)
for(it=m.begin();it!=m.end();it++)//begin和end分别代表迭代器的头部和尾部
{
if(it->second>count)
{
count=it->second;//second代表value
ans=it->first;//first代表key
}
}
cout<<ans;
return 0;
}
方法二
#include <iostream>
using namespace std;
int main()
{
int n,number[1000]={0};//此处,number的下标即是输入的数字,number的值是数字出现的次数
cin>>n;//输入
for(int i=0;i<n;i++)
{
int num;
cin>>num;
number[num]++;//找到下标为num的地方,次数自增1
}
int ans,max=0;//max即最大次数
for(int i=0;i<1000;i++)
{
if(number[i]>max)//找出最多次数的那个数字,注意,此处不能等于,因为在相同次数下,只能要最小的数
{
max=number[i];
ans=i;
}
}
cout<<ans;
return 0;
}
两种方法的比较
很明显,方法二在时间上不占优势,容易造成失分