题目://求数组中元素出现次数超过数组长度一半的数字。
思路://1.先排序,再输出,数组中间的那个数(arr[n/2]),这种办法对于有偶数个元素的数组可能会出现错误;
2.遍历整个数组,将遍历到的相同的数的次数加起来,最后返回,次数多的数,这个数就是出现次数超过数组长度一半的数。(本次所用的就是这种方法)
#include<stdio.h>
#include<Windows.h>
int Find(int *arr, int len){
int num = 0;
int times = 0;
int i = 0;
for (i = 0; i < len; i++){
if (times == 0){
num = arr[i]; //先给num一个值,记录次数为1
times = 1;
}
else if (arr[i] == num){ //在遍历的时候,有相同的则次数加1
times++;
}
else{
times--; //不同的则次数减1,超过数组长度一半的数,times肯定大于0
}
}
return num;
}
int main(){
int arr[] = { 1, 2, 3, 2, 2, 2, 5, 4, 2 };
printf("超过一半的数是: %d\n", Find(arr, sizeof(arr) / sizeof(arr[0])));
system("pause");
return 0;
}
运行结果: