2013-09-08 10:50:46
一个整型数组中,除了两个数字之外,其他数字都出现了2次,找出这两个只出现一次的数字,要求时间复杂度是O(N),空间复杂度是O(1)。
小结:
- 任何数与0异或,结果仍为本身;
- 两个相同的数字异或,结果为0;
- 利用异或的以上两个特点,进行求解。
代码(测试暂未发现问题,欢迎交流指正!):
1 #include <iostream> 2 #include <cassert> 3 using namespace std; 4 5 typedef int DataType; 6 7 //返回一个数字的二进制表示中最低位的1的位置 8 size_t GetNumberOfOnce(DataType number) 9 { 10 assert(number != 0); 11 12 size_t mask = 1; 13 size_t cnt = 0; 14 15 while ( !(number & mask) ) 16 { 17 ++cnt; 18 number = number>>1; 19 } 20 21 return (cnt); 22 } 23 24 //找出一个数组中仅出现一次的数字,通过pNumber1、pNumber2返回 25 void GetNumberOfOnce(DataType *array,size_t len,DataType *pNumber1,DataType *pNumber2) 26 { 27 assert(array != NULL); 28 assert(len >= 2); 29 30 *pNumber1 = 0; 31 *pNumber2 = 0; 32 size_t index = 0; 33 size_t resXOR = array[0]; 34 35 for (index = 1;index < len;++index) 36 { 37 resXOR ^= array[index]; 38 } 39 40 size_t positionOf1 = GetNumberOfOnce(resXOR); 41 size_t mask = 1 << positionOf1; 42 43 for (index = 0;index < len;++index) 44 { 45 if (array[index] & mask) //任何数与0异或,结果仍为本身 46 { 47 *pNumber1 ^= array[index]; 48 } 49 else 50 { 51 *pNumber2 ^= array[index]; 52 } 53 } 54 } 55 56 //测试GetNumberOfOnce函数 57 void TestGetNumberOfOnce() 58 { 59 DataType array[10] = {1,2,3,2, 3,5,6,7, 6,5}; 60 //DataType array[10] = {1, 6}; 61 size_t len = 10; 62 DataType number1 = 0; 63 DataType number2 = 0; 64 65 GetNumberOfOnce(array,len,&number1,&number2); 66 cout<<"the numbers appear once are : "<<number1<<" "<<number2<<endl; 67 } 68 69 int main() 70 { 71 TestGetNumberOfOnce(); 72 return 0; 73 }
测试结果:
the numbers appear once are : 7 1 请按任意键继续. . .