题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
数字中如果一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数的和还要多。
代码实现:
#include <iostream>
using namespace std;
//判断输入的数组是不是无效的
bool g_InputInvalid = false;
bool CheckInvalidArray(int* numbers, int length)
{
if(numbers == NULL && length<=0)
g_InputInvalid = true;
return g_InputInvalid;
}
//如果数组中出现频率最高的数字都没有达到这个标准
bool CheckMoreThanHalf(int* numbers, int length, int number)
{
int times = 0;
for(int i = 0; i<length; i++)
{
if(numbers[i] == number)
times++;
}
bool isMoreThanHalf = true;
if(times * 2 <= length)
{
g_InputInvalid = true;
isMoreThanHalf = false;
}
return isMoreThanHalf;
}
int MoreThanHalfNum(int* numbers, int length)
{
if(CheckInvalidArray(numbers, length))//数组输入不合法
return 0;
int result = numbers[0];
int times = 1;
for(int i = 1; i< length; i++)
{
if(times == 0) //如果次数为零,需要保存下一个数字,并把次数减1
{
result = numbers[i];
times = 1;
}
else if(numbers[i] == result) //如果下一个数字和之前保存的数字相同,则次数加1
times++;
else //否则,就将次数减1
times--;
}
if(!CheckMoreThanHalf(numbers, length, result))
cout<<"输入不合法";
return result;
}
int main()
{
int a[10] = {1,2,2,3,2,3,2,4,2,2};
int result = MoreThanHalfNum(a, 10);
cout<<"查找结果为: " <<result<<endl;
}