//============================================================================
// Name : 100题之数组中出现次数超过一半的数字.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
// 数组中超过出现次数超过一半的数字以及超过三分之一的两个数字,超过四分之一的三个数字
// from: http://www.xuebuyuan.com/1914142.html
#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");
}
return;
}
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;
return true;
}
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");
}
/*
//获取数组中出现次数超过数组长度1/3的元素, 该算法错误
bool getMoreThanThird( int a[], int low, int high, int &result )
{
bool ret = true;
if( NULL == a || low > high )
{
ret = false;
cout << "getMoreThanThird func: err -1, NULL==a || low > high" << endl;
return ret;
}
if( low == high || low + 1 == high )
{
result = a[low];
return ret;
}
int cnt = 2;
int value = a[low];
for( int i = low + 1; i <= high; ++i )
{
if( a[i] == value )
{
++cnt;
}
else
{
--cnt;
if( 0 == cnt )
{
cnt = 2;
value = a[i];
}
}
}
cnt = 0;
for( int i = low; i <= high; ++i )
{
if( a[i] == value )
{
++cnt;
}
}
if( cnt > ( high - low + 1 ) / 3 )
{
result = value;
}
else
{
cout << "getMoreThanThird func: err -1, no this element whose count is bigger than the length of array" << endl;
ret = false;
}
return ret;
}
*/
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;
//getMoreThanThird( a, 0, 39, first );
cout << first << endl;
return 0;
}
数组中超过出现次数超过一半的数字以及超过三分之一的两个数字,超过四分之一的三个数字
最新推荐文章于 2021-06-19 13:07:14 发布