码迷,mamicode.com
首页 > 编程语言 > 详细

剑指offer——面试题40:数组中只出现一次的数字

时间:2015-09-03 19:14:54      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

题目:

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

思路:

(1)首先考虑数组中若是只有一个数字是出现一次,其他都是出现两次的情况,在这种情况下,将所有的

数字都位异或运算(^),因为相同的数字异或结果为0,所以最后地到的结果就是那个出现一次的数。

(2)下面考虑本题出现有两个出现一次,其他的都是出现一次,这种情况下,可以将所有的异或一遍,

那么最后得到的结果为这两个出现一次的数的异或的结果。

       然后找到这个数的从右为0数起的第一个不为0的位,这样可以根据这个位将这个数组分成两部分,一部分

这个第n位为0,一部分这个第n位为1.

      然后再分别异或,最后得到的两个结果就是了。

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 //找到这个数的右起第几位不为0.
 6 int number_of_first_one(unsigned int a)
 7 {
 8     int re=0;
 9     for(int i=0;i<32;i++)
10     {
11         if((a&(1<<i))!=0)
12         {re=i;break;}
13     }
14     return re;
15 }
16 
17 //判断右起第n位是否为1
18 bool ifone(unsigned int a,int n)
19 {
20     if(a&(1<<n))
21         return 1;
22     else
23         return 0;
24 }
25 
26 //主函数。
27 void find_number(vector<int>& vec,int *num1,int *num2)
28 {
29     if(vec.empty())
30         return;
31     int len=vec.size();
32     if(len<=1)
33         return;
34 
35     unsigned int a=vec[0];
36     for(int i=1;i<len;i++)
37         a^=vec[i];
38 
39     int n=number_of_first_one(a);
40     *num1=0;
41     *num2=0;
42     for(int i=0;i<len;i++)
43     {
44         if(ifone(vec[i],n))
45             *num1^=vec[i];
46         else
47             *num2^=vec[i];
48     }
49 }
50 int main()
51 {
52     int ary[8]={2,4,3,6,3,2,5,5};
53     vector<int> vec(ary,ary+8);
54     int num1;
55     int num2;
56     find_number(vec,&num1,&num2);
57     cout<<num1<<endl;
58     cout<<num2<<endl;
59     system("pause");
60 }

 

剑指offer——面试题40:数组中只出现一次的数字

标签:

原文地址:http://www.cnblogs.com/yanliang12138/p/4780461.html

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