码迷,mamicode.com
首页 > 其他好文 > 详细

【数组中出现奇数次的2个数】 笔试题精选

时间:2014-10-10 11:54:14      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   ar   for   sp   div   art   

转自:http://blog.csdn.net/wodewe/article/details/6863753#

 

题:有N+2个数,N个数出现了偶数次,2个数出现了奇数次(这两个数不相等),问用O(1)的空间复杂度,找出这两个数,不需要知道具体位置,只需要知道这两个值。
求解:如果只有一个数出现过奇数次,这个就比较好求解了,直接将数组中的元素进行异或,异或的结果
就是只出现过奇数次的那个数。
但是题目中有2个数出现了奇数次?,求解方法如下:
假设这两个数为a,b,将数组中所有元素异或结果x=a^b,判断x中位为1的位数(注:因为a!=b,所以x!=0,我们只需知道某一个位为1的位数k,例如0010 1100,我们可取k=2或者3,或者5),然后将x与数组中第k位为1的数进行异或,异或结果就是a,b中一个,然后用x异或,就可以求出另外一个。
为什么呢?因为x中第k位为1表示a或b中有一个数的第k位也为1,假设为a,我们将x与数组中第k位为1的数进行异或时,也即将x与a外加其他第k位为1的出现过偶数次的数进行异或,化简即为x与a异或,结果是b。

 

void getNum(int a[],int length) 
{ 
    int s=0;//保存异或结果 
    for(int i=0;i<length;i++) 
    { 
        s=s^a[i]; 
    } 
   int temp1=s;//临时保存异或结果 
   int temp2=s;//临时保存异或结果 
    int k=0; 
    while(!(temp1&1))//求位为1的位数 
    { 
        temp1=temp1>>1; 
        k++; 
    } 
    for(int i=0;i<length;i++) 
    { 
        if((a[i]>>k)&1)//将s与数组中第k位为1的数异或 
        { 
            cout<<a[i]<<" "; 
            s=s^a[i]; 
        } 
    } 
    cout<<s<<" "<<(s^temp2)<<endl;//(s^temp2)用来求另外一个数 
} 

 

 

【数组中出现奇数次的2个数】 笔试题精选

标签:style   blog   http   color   ar   for   sp   div   art   

原文地址:http://www.cnblogs.com/balfish/p/4015140.html

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