這道題實際上不難,用很笨的方法也是能解答出來的,但是浪費了程序的時間和空間,從網上查到一種思路,覺得不錯。
有個數字出現的次數超過了數組長度的一半,也就是,有個數字出現的次數比其他所有數字出現次數的和還要多。遍歷數組時保存連個值,一個是數組中的數字,一個是出現的次數,遍歷到一個數字時,如果該數字和之前保存的數字相同,則次數加一,如果該數字和之前保存的數字不同,則次數減一,如果次數為零,遍歷下一個數組元素,並把次數設為一。要找的數字肯定是最後一次把次數設為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;
}
作者“菜鳥變身記”