方法1:一边扫描,相当于每次消去2个不同的元素,最后剩下的肯定是要找的元素
方法2:利用哈希表或者数组统计每个字符出现的次数,然后从里面找到出现次数超过一半的
方法3:排序后,取数组的中间元素
#include "stdafx.h"
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int findSingle1(int a[] ,int len)//一遍扫描法
{
int tmp = a[0];
int count = 1;
for(int i=1;i<len;i++)
{
if(count == 0)
{
tmp = a[i];
count++;
continue;
}
if(a[i] == tmp)
count++;
else{
count--;
}
}
return tmp;
}
int findSingle2(int a[], int len)//hashmap 统计
{
map<int,int> imap;
map<int,int>::iterator it ;
for(int i=0;i<len;i++)
{
it = imap.find(a[i]);
if(it!=imap.end())
{
(*it).second++;
}else{
imap[a[i]] = 1;
}
}
it = imap.begin();
while(it!=imap.end())
{
if((*it).second > len/2)
return (*it).first;
it++;
}
return -1;
}
int findSingle3(int a[],int len)//排序后取中间元素
{
sort(a,a+len);
return a[len/2];
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {1,3,4,8,5,1,2,5,5,5,5,5,5};
int len = sizeof(a)/sizeof(int);
cout<<findSingle3(a,len)<<endl;
getchar();
return 0;
}