版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzc2608/article/details/81199813
#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;
void printHalf(vector<int>& arr)
{
int cand = 0;
int times = 0;
for(int i = 0; i != arr.size(); ++i)
if(times == 0)
{
cand = arr[i];
times = 1;
}
else if(arr[i] == cand)
++times;
else
--times;
times = 0;
for(int i = 0; i != arr.size(); ++i)
if(arr[i] == cand)
++times;
if(times > arr.size() / 2)
cout << cand << endl;
else
cout << "no such number" << endl;
}
map<int, int> getReals(vector<int>& arr, map<int, int>& cands)
{
map<int, int> reals;
for(int i = 0; i != arr.size(); ++i)
{
int curNum = arr[i];
if(cands.find(curNum) != cands.end())
if(reals.find(curNum) != reals.end())
++reals[curNum];
else
reals.insert(pair<int, int>(curNum, 1));
}
return reals;
}
void allCandMinusOne(map<int, int>& imap)
{
vector<int> removelist;
map<int, int>::iterator it;
for(it = imap.begin(); it != imap.end(); ++it)
{
int key = it->first;
int value = it->second;
if(value == 1)
removelist.push_back(key);
else
--imap[key];
}
for(int i = 0; i < removelist.size(); ++i)
imap.erase(removelist[i]);
}
void printmajor(vector<int> & arr, int k)
{
if(k < 2)
{
cout << " k is invalid" << endl;
return;
}
map<int, int> cands;
for(int i = 0; i < arr.size(); ++i)
{
if(cands.find(arr[i]) != cands.end())
++cands[arr[i]];
else
{
if(cands.size() == k - 1)
allCandMinusOne(cands);
else
cands[arr[i]] = 1;
}
}
map<int, int> reals = getReals(arr, cands);
map<int, int>::iterator it = reals.begin();
bool flag = false;
for(; it != reals.end(); ++it)
{
int key = it->first;
if(reals[key] > arr.size() / k)
{
flag = true;
cout << key << " ";
}
}
cout << (flag ? "" : "no much number") << endl;
}
int main()
{
int a[] = {1, 2, 3, 4, 1, 1, 2, 1, 1, 5, 1, 1, 2, 1};
vector<int> ivec(a, a + 14);
printHalf(ivec);
printmajor(ivec, 7);
}