码迷,mamicode.com
首页 > 其他好文 > 详细

寻找单独出现的数——通用技巧

时间:2016-06-10 11:09:15      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

请使用最快的方法,寻找单独出现的数。
例1:在一组数据中,只有一个数出现一次,其余数都出现两次,请找出这个单独出现的数。
例2:在一组数据中,只有一个数出现一次,其余数都出现三次,请找出这个单独出现的数。
例3:在一组数据中,只有一个数出现一次,其余数都出现四次,请找出这个单独出现的数。
例4:在一组数据中,只有一个数出现一次,其余数都出现五次,请找出这个单独出现的数。
...........

分析:
 像这种问题都可以通过排序来解决,但是毫无疑问,排序不是最快的方法。针对例1,大部分人都能想到,将所有数字全部异或,最后剩下来的数就是单独出现的数。但是问题一但升级,这种方法就行不通了,那么有没有一种通用的方法来解决这类问题呢???答案肯定是有的!!!

算法:
  既然这组数据中除了一个数出现一次外,其余数都出现了n次,借助一个bit[32] ,我们可以把这组数据中所有数据的第一个bit位统计出来加到一起放到bit[0]里面,以此类推,直到把所有bit位统计完为止。既然除一个数外其余数都出现n次,那么bit[i]%n所得到的结果就是单独的数中相应bit位上的结果。

以例2为例,有以下代码:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


int check_along_num(int *arr,int len)
{
	assert(arr);
	int bit[32] = { 0 };                   
	int i = 0;
	int j = 0;
	int ret = 0;
	for (i = 0; i < len;i++)
	{
		for (j = 0; j < 32;j++)
		{
			bit[j] += ((arr[i] >> j)&1);        //统计数组中所有元素每一位上1的个数之和
		}
	}
	for (i = 0; i < 32;i++)
	{
		ret+=((1<<i)&((bit[i] % 3)<<i));         //出现三次的数,在bit[]中对应位上是3的倍数
	}
	return ret;
}
int main()
{
	int arr[10];
	for (int i = 0; i < 10;i++)
	{
		scanf("%d",&arr[i]);
	}
	int sz = sizeof(arr)/sizeof(arr[0]);
	int ret=check_along_num(arr,sz);
	printf("%d\n",ret);
	system("pause");
	return 0;
}


寻找单独出现的数——通用技巧

标签:

原文地址:http://blog.csdn.net/lf_2016/article/details/51626240

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!