题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
思想:我们假设存在这样的数字,次数超过一半,那么那个数的次数减去其它数字的次数一定大于0.
说白了就是:从前到后,碰到两个不两同的数,我们就删了它们,当然不是真删除,我们可以用一个记数器+一个变量保存频繁出现的值。这样最后得到的数就是要求的。
还有一种比较偷懒的方法,但效率要差,先排序qsort一下,那么中间那个元素一定是所求。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//前提是确实存在这样的数
int findNumFrequencyMoreThanHalf(int *a, int len)
{
int i, c = 0, freq;
assert(a && len>0);
for (i = 0; i < len; i++)
{
if (c == 0)
{
freq = a[i];
++c;
}
else
{
if (freq == a[i]) ++c;
else --c;
}
}
return freq;
}
int main(void)
{
int a[]={2,12,23,34,3,3,5,3,4,3,5,3,3,3};
printf("the frequency num is:%d\n",findNumFrequencyMoreThanHalf(a,sizeof(a)/sizeof(int)));
return 0;
}