题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:因为该数字超过了数组的长度的一半,因此该数在数组出现的次数都超过了其他所有数字出现次数之和,所以我们可以使用下面这个算法来求解。
算法:
- 初始化一个数组arr,并求出该数组的长度len.
- 设置两个变量,一个cur,表示当前元素,一个count,用于存放出现当前元素的次数
- 遍历数组,当count==0时,使cur=arr[i],count = 1,否则执行4)
- 如果cur== arr[i],count++,否则count–
- 遍历结束时,放回cur,就是所求值
代码实现:
#include <stdio.h>
#include <stdlib.h>
int Find(int* arr, int len) {
int count = 0;
int cur = 0;
int i = 0;
for(; i < len; ++i){
if(count == 0){
cur = arr[i];
count = 1;
}else{
if( cur == arr[i]){
count++;
}
else{
count--;
}
}
}
return cur;
}
int main() {
int arr[] = { 0,1,1,1,1,2,3,1,1};
int len = sizeof(arr)/sizeof(arr[0]) - 1;
int ret = Find(arr, len);
printf("%d\n", ret);
return 0;
}