题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解答:
#include<stdio.h>
#include<stdbool.h>
#define true 1
#define false 0
bool gInvalid=false;
//判断是否非法输入
bool CheckInvalid(int* numbers,int length)
{
gInvalid=false;
if(numbers==NULL||length<=0)
{
gInvalid=true;
}
return gInvalid;
}
//判断是否存在出现次数超过数组长度的一半的数
bool CheckMoreThanHalf(int* numbers,int length,int number)
{
int times=0;
for(int i=0;i<length;++i)
{
if(numbers[i]==number)
times++;
}
bool gMoreThanHalf=true;
if(times*2<=length)
{
gMoreThanHalf=false;
}
return gMoreThanHalf;
}
//查找出现次数超过数组长度的一半的数
void MoreThanHalf(int* numbers,int length)
{
if(CheckInvalid(numbers,length))
{ printf("Invalid!\n");
return ;
}
//times出现次数
//result是数
int result=numbers[0];
int times=1;
int i=1;
for(i;i<length;++i)
{
if(times==0)
{
result=numbers[i];
times++;
}
else if(numbers[i]==result)
{
times++;
}
else
{
times--;
}
}
//判断出现次数是否超过一半
if(!CheckMoreThanHalf(numbers,length,result))
{ printf("No number!\n");
return ;
}
printf("%d\n",result);
}
int main()
{
int a[9]={1,5,6,7,9,7,7,7,7};
MoreThanHalf(a,9);
return 0;
}