本文主要是介绍第六十一题(找出数组中两个只出现一次的数字),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是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;
}
运行结果:
这篇关于第六十一题(找出数组中两个只出现一次的数字)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!