题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
#include <iostream>
using namespace std;
bool Check(int* number,int result,int length)
{
int times = 0;
for(int i=0; i<length;i++)
{
if(number[i] == result)
times++;
}
if(times * 2 >= length)
return true;
else
return false;
}
int MoreThanHalf(int* number, int length)
{
if(number == NULL || length <= 0)
return 0;
int times = 1;
int result = number[0];
for (int i = 1;i < length; i++)
{
if(number[i] == result)
{
times++;
}else if(times == 0)
{
result = number[i];
times = 1;
}else
times--;
}
if(Check(number,result,length))
return result;
else
return 0;
}
// ====================测试代码====================
void Test(char* testName, int* numbers, int length, int expectedValue, bool expectedFlag)
{
if(testName != NULL)
printf("%s begins: \n", testName);
printf("Test for solution1: ");
int result = MoreThanHalf(numbers, length);
if(result == expectedValue)
printf("Passed.\n");
else
printf("Failed.\n");
}
// 存在出现次数超过数组长度一半的数字
void Test1()
{
int numbers[] = {1, 2, 3, 2, 2, 2, 5, 4, 2};
Test("Test1", numbers, sizeof(numbers) / sizeof(int), 2, false);
}
// 不存在出现次数超过数组长度一半的数字
void Test2()
{
int numbers[] = {1, 2, 3, 2, 4, 2, 5, 2, 3};
Test("Test2", numbers, sizeof(numbers) / sizeof(int), 0, true);
}
// 出现次数超过数组长度一半的数字都出现在数组的前半部分
void Test3()
{
int numbers[] = {2, 2, 2, 2, 2, 1, 3, 4, 5};
Test("Test3", numbers, sizeof(numbers) / sizeof(int), 2, false);
}
// 出现次数超过数组长度一半的数字都出现在数组的后半部分
void Test4()
{
int numbers[] = {1, 3, 4, 5, 2, 2, 2, 2, 2};
Test("Test4", numbers, sizeof(numbers) / sizeof(int), 2, false);
}
// 输入空指针
void Test5()
{
int numbers[] = {1};
Test("Test5", numbers, 1, 1, false);
}
// 输入空指针
void Test6()
{
Test("Test6", NULL, 0, 0, true);
}
int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
return 0;
}