求数组中出现次数超过一半的数字

来源:互联网 发布:西北工业大学矩阵论 编辑:程序博客网 时间:2024/05/22 17:55

题目:一个数组中有一个数字的次数超过了数组的一半,求出这个字符。如:int a[]={2,3,2,2,2,2,2,5,4,1,2,3},求出超过一半的数字是2


 由题目可知,这个数字出现的次数,比其他所有数字出现次数之和还要大,所以在遍历时可以保存两个值,一个是里面的数字,一个是出现的次数。

情况:

1)如果下一个数字和保存的数字相同,次数加1

2)如果下一个数字和保存的数字不同,次数减1

3)如果次数为0,把保存的数字换成下一个

这样,最后保存的数字一般就是出现次数最多的,当然还需要检验一下,放止特殊情况干扰结果。

static bool CheckNum(int *numbers, int length, int number){int times = 0;for (int i = 0; i < length; ++i){if (numbers[i] == number)times++;}if (times * 2 <= length)return false;return true;}int MoreThanHalfNum(int *numbers, int length){int flag = 1;int ret = numbers[0];for (int idx = 0; idx < length; ++idx){if (flag == 0){ret = numbers[idx];flag = 1;}else if (numbers[idx] == ret)flag++;elseflag--;}if (CheckNum(numbers, length, ret))return ret;return 0;}