【剑指offer】找出数组中出现一次的两个数

2013-09-08 10:50:46

一个整型数组中,除了两个数字之外,其他数字都出现了2次,找出这两个只出现一次的数字,要求时间复杂度是O(N),空间复杂度是O(1)。

小结:

  1. 任何数与0异或,结果仍为本身;
  2. 两个相同的数字异或,结果为0;
  3. 利用异或的以上两个特点,进行求解。

代码(测试暂未发现问题,欢迎交流指正!):

 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<<"\t"<<number2<<endl;
67 }
68 
69 int main()
70 {
71     TestGetNumberOfOnce();
72     return 0;
73 }

 

测试结果:

the numbers appear once are : 7 1
请按任意键继续. . .

 

posted @ 2013-09-08 10:55  永不止步,永无止境  阅读(306)  评论(0)    收藏  举报