题意
给出n个数,zjm想找出出现至少(n+1)/2次的数, 现在需要你帮忙找出这个数是多少?
Input
本题包含多组数据:
每组数据包含两行。
第一行一个数字N(1<=N<=999999) ,保证N为奇数。
第二行为N个用空格隔开的整数。
数据以EOF结束。
Output
对于每一组数据,你需要输出你找到的唯一的数。
输入样例
5
1 3 2 3 3
11
1 1 1 1 1 5 5 5 5 5 5
7
1 1 1 1 1 1 1
输出样例
3
5
1
提示
分析
简单的规律题
- 题目分析
这道题的关键在于答案唯一,以及目标数字出现至少为(n+1)/2次。因此只要发现一个数出现次数满足该要求,就说明该数字是答案了。
方法也很简单,善用stl:
从列首开始依次遍历,将当前扫描元素从序列中删除,判断删除前后序列长度,长度差即为扫描元素的个数。将该元素个数与(n+1)/2比较即可得到答案。
- ***问题 ***
- 注意(n+1)/2中的n是指的序列原长。
- 注意是至少等于(n+1)/2,不是等于。
总结
- 做这种题就很愉悦🤤
代码
//
// main.cpp
// lab1
//
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> number;
int main()
{
ios::sync_with_stdio(false);
int n = 0,a = 0,sz = 0;
while( cin>>n )
{
for( int i = 0 ; i < n ; i++ )
{
cin>>a;
number.push_back(a);
}
n = (n + 1) >> 1; //得到出现次数
while( !number.empty() )
{
sz = number.size();
a = number[0];
//将当前的第一个元素全都去掉
number.erase(remove(number.begin(), number.end(), a), number.end());
//得到去掉的个数,即为之前第一个元素的个数
if( sz - number.size() >= n ) //至少为n次,不是等于n次
{
cout<<a<<endl;
break;
}
}
number.clear();
}
return 0;
}