//============================================================================ // Name : 100题之数组中出现次数超过一半的数字.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> using namespace std; const int MAX=65535; void MoreThanForthNum(int *a,int length,int &first,int &second,int &thrid) { if(!a||length<=0) throw new string("no valid input"); if(length<=2) throw new string("no valid input"); if(length==3) { first=a[0]; second=a[1]; thrid=a[2]; return ; } first=0; second=0; thrid=0; int symbol=a[0],number=1; int symbol1=0,number1=0; int symbol2=0,number2=0; for(int i=1;i<length;i++) { if(!number&&symbol1!=a[i]&&symbol2!=a[i]) { symbol=a[i]; number=1; } else if(symbol==a[i]) number++; else if(symbol1!=a[i]&&symbol2!=a[i]) { number--; } if(!number1&&symbol!=a[i]&&symbol2!=a[i]) { symbol1=a[i]; number1=1; } else if(symbol1==a[i]) number1++; else if(symbol!=a[i]&&symbol2!=a[i]) number1--; if(!number2&&symbol!=a[i]&&symbol1!=a[i]) { symbol2=a[i]; number2=1; } else if(symbol2==a[i]) number2++; else if(symbol!=a[i]&&symbol1!=a[i]) number2--; } first=symbol; second=symbol1; thrid=symbol2; number1=0; number=0; number2=0; for(int i=0;i<length;i++) { if(a[i]==first) number++; if(a[i]==second) number1++; if(a[i]==thrid) number2++; } if(!(number*4>=length&&number1*4>=length&&number2*4>=length)) throw new string("invalid input"); } bool MoreThanThridNum(int *a,int length,int &first,int &second) { if(!a||length<=0) throw new string("no valid input"); if(length==1) throw new string("no valid input"); if(length==2) { first=a[0]; second=a[1]; return true; } int symbol=a[0],number=1; int symbol1=MAX,number1=0; for(int i=1;i<length;i++) { if(!number&&symbol1!=a[i]) { symbol=a[i]; number=1; } else if(symbol==a[i]) number++; else { number--; } if(!number1&&symbol!=a[i]) { symbol1=a[i]; number1=1; } else if(!number1&&symbol==a[i]) { symbol1=MAX; continue; } else if(symbol1==a[i]) number1++; else if(symbol1!=MAX) number1--; } first=symbol; second=symbol1; } int MoreThanHalfNum(int *a,int length) { if(!a||length<=0) throw new string("no valid input"); int symbol=a[0]; int number=1; for(int i=1;i<length;i++) { if(symbol==a[i]) number++; else number--; if(number==0) { symbol=a[i]; number=1; } } number=0; for(int i=0;i<length;i++) { if(symbol==a[i]) number++; } if(number*2>=length) return symbol; else throw new string("no valid input"); } int main() { //int a[10]={2,2,3,3,2,2,3}; int a[] = {5, 5, 5, 7, 7, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 6, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 5, 7, 2, 2, 2, 5, 5, 5, 8}; int length=40; // cout << MoreThanHalfNum(a,length)<< endl; int first,second,thrid; // MoreThanThridNum(a, length,first,second); // cout<<first<<" "<<second<<endl; MoreThanForthNum(a, length,first,second,thrid); cout<<first<<" "<<second<<" "<<thrid<<endl; return 0; }