给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
我认为这题不是很难,大家应该都有自己的想法,不过应该有不少人虽然有着想法但无法将它实现吧,我先来说说我的想法。
首先我们能从中了解到,它是一个有序数组,所以它们之间相同的元素应该紧挨在一起,这就省了我们将它变成有序的步骤。我们先设一个变量flag=1;这是元素的个数,因为至少都有一个,所以我们将它初始化为1,当它和它的后一个相同时就让它加一,如果不同则让flag=1,然后比较flag是否大于元素个数/4;依次循环下去,直到找到该元素为止。下面是代码:
int findSpecialInteger(int* arr, int arrSize) {
if (arrSize < 4)//当元素个数小于4时,那么它们所有的元素都相同,因为如果不同则于题目恰好有一个整数,它的出现次数超过数组元素总数的 25%。
{
return arr[0];
}
int i = 0;
int flag = 1;
for (i = 0; i < arrSize - 1; i++)//arrSize-1是为了于后面的一个元素比较而不至于数组越界。
{
if (arr[i] == arr[i + 1])
{
flag++;//记录相同元素的个数。
}
else
{
flag = 1;
}
if (flag > arrSize / 4)//为什么不放在else里面:为了防止其元素在最后,以至于还没比较就直接结束循环。
{
return arr[i];
}
}
return 0;
}