您的位置:首页 > 其它

第六十一题(找出数组中两个只出现一次的数字)

2014-07-04 18:00 363 查看
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。

请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

思路:先对所有数据进行异或得到结果result,两两相同的数据异或结果为0,因此result为两个只出现1次的数字异或的结果,求得result左边第一个值为1的位,根据异或的性质可知,这两个只出现一次的数字该位上的值肯定不同,一个为0,一个为1,以此为标准,对整个数组中的该位为1的数字进行异或,相同的数字两两消去,得到的结果为该位为1的只出现了一次的数字,同理求得另一个数字。

C++代码:

#include "stdafx.h"
#include<iostream>
namespace MS100P_61
{
	void findTwoSingle(int data[],int length)
	{
		int result=0;
		for (int i = 0; i < length; i++)
			result = result^data[i];	
		
		int bitIndex;
		for (bitIndex = 0; bitIndex < 8 * sizeof(int); bitIndex++)
		{
			if (result&(1 << bitIndex))
				break;
		}
					
		
		result = 0;
		for (int i = 0; i < length;i++)
		if (data[i] & (1 << bitIndex))
			result = result^data[i];
		cout << "one number is:" << result << endl;

		result = 0;
		for (int i = 0; i < length; i++)
		if (!(data[i] & (1 << bitIndex)))
			result = result^data[i];
		cout << "the other is:" << result << endl;
	}
	void test()
	{
		int A[] = {3,3,2,2,12,12,7,-1};
		findTwoSingle(A, 8);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	MS100P_61::test();
	return 0;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: