数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
方法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; }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。