数组中超过出现次数超过一半的数字以及超过三分之一的两个数字,超过四分之一的三个数字

//============================================================================
// 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值