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

题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
思想:我们假设存在这样的数字,次数超过一半,那么那个数的次数减去其它数字的次数一定大于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;
}

你可能感兴趣的:(c)