您的位置:首页 > 其它

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

2012-08-27 17:19 232 查看
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。

思想:我们假设存在这样的数字,次数超过一半,那么那个数的次数减去其它数字的次数一定大于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: