当前位置:编程学习 > C/C++ >>

数组中有一个数字出现的次数超过了数组长度的一半,找出这个数

这道题实际上不难,用很笨的方法也是能解答出来的,但是浪费了程序的时间和空间,从网上查到一种思路,觉得不错。
        有个数字出现的次数超过了数组长度的一半,也就是,有个数字出现的次数比其他所有数字出现次数的和还要多。遍历数组时保存连个值,一个是数组中的数字,一个是出现的次数,遍历到一个数字时,如果该数字和之前保存的数字相同,则次数加一,如果该数字和之前保存的数字不同,则次数减一,如果次数为零,遍历下一个数组元素,并把次数设为一。要找的数字肯定是最后一次把次数设为1时对应的数字。
 
#include   <iostream> 
using   namespace   std; 
bool g_bInputInvalid = false; 
int MoreThanHalfNum(int* numbers, unsigned int length) 

    if(numbers == NULL && length == 0) 
    { 
        g_bInputInvalid = true; 
        return 0; 
    } 
    g_bInputInvalid = false; 
    int result = numbers[0]; 
    int times = 1; 
    for(int i = 1; i < length; ++i) 
    { 
        if(times == 0) 
        {   result = numbers[i]; 
            times = 1; 
        } 
        else if(numbers[i] == result) 
            times++; 
        else
            times--; 
    } 
    // verify whether the input is valid 
    times = 0; 
    for( int i = 0; i < length; ++i) 
    { 
        if(numbers[i] == result) 
            times++; 
    } 
    if(times * 2 <= length) 
    { 
        g_bInputInvalid = true; 
        result = 0; 
    } 
    return result; 

void main() 

    int a[]={1,2,2,3,4,5,2,2,2}; 
    int re=MoreThanHalfNum(a,9); 
    cout<<re; 

作者“菜鸟变身记”

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,