这道题目由于不容易写测试用例,所以,可以把题目转换为:在一个数组中,有一个数字出现的次数超过了数组大小的一半,这和题目原意是一样的。
这道题目的思想是我们同时去掉数组中两个不一样的数字,那么,数组中原来存在的规律是不变的(仅针对这个题目)。
好吧,还是先给出函数声明:
/*2.3 寻找发帖水王*/
bool DutVerify(int*, int, int);
int DutFindNumMoreThanHalf(int*, int);
由于注释都已经写在了代码里,这里不多做解释,贴代码吧:
/*验证有效函数*/
bool DutVerify(int* A, int size, int result)
{
/*出现的次数*/
int count = 0;
for (int i = 0; i < size; ++i)
{
if (A[i] == result)
++count;
}
/*验证出现的次数是否大于数组长度的一半*/
if (count > (size / 2))
return true;
else
return false;
}
/*这个题目转换为数组中存在某一个数,这个数出现的次数大于数组中元素个数的一半*/
/*全局变量标识输入参数是否有效*/
bool _DutFindNumMoreThanHalf = false;
int DutFindNumMoreThanHalf(int* A, int size)
{
if (!A || size <= 0)
{
_DutFindNumMoreThanHalf = true;
return -1;
}
int result;
int count = 0;
/*
*这里的思想是同时去掉两个不一样的数字,那么数组的“原型”不会改变,
*即大于一半的那个数字在当前的数组中还是大于当前个数的一半
*/
for (int i = 0; i < size; ++i)
{
if (count == 0)
{
result = A[i];
++count;
}
else
{
if (result == A[i])
++count;
else
--count;
}
}
/*当得到这个数字之后,我们需要验证这个数字是否出现的次数大于总个数的一半*/
bool res = DutVerify(A, size, result);
if (res == true)
return result;
else
{
_DutFindNumMoreThanHalf = true;
return -1;
}
}