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

神奇的亦或

时间:2016-02-03 00:16:33      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

 一、一个整数数组,只有唯一一个元素出现一次,其他的元素都出现两次,找出这个元素。

  解析:根据a^a=0,只需将所有的元素亦或起来,得到的结果就是该元素。以LeetCode 136.为例,代码如下:

  

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans=0;
        for(int i=0;i<nums.size();++i)
            ans^=nums[i];
        return ans;
    }
};

 

二、一个整数数组,有两个不同的元素各出现一次,其他元素均出现两次,找出这两个元素。

  解析:设要求的两个元素为x、y。将所有元素的亦或起来,便得到这两个元素的亦或运算值,并且这个值一定不是0,即,在某位比特位(假设第k位)上值是1。所以根据第k位上的值将数组中的元素分成两部分,分别亦或起来得到的两个值便是x和y的值。以LeetCode 260.为例,代码如下:

  

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        vector<int>ans;
        int a=0;
        for(int i=0;i<nums.size();++i)
            a^=nums[i];
        a=a^(a&(a-1));
        int x=0,y=0;
        for(int i=0;i<nums.size();++i)
            if(nums[i]&a) x^=nums[i];
            else y^=nums[i];
        ans.push_back(x);
        ans.push_back(y);
        return ans;
    }
};

  

三、有一个长度为n+1的数组,其中的元素是0~n这n+1个数。现在,这个数组中丢失了一个元素,请找回这个元素。

  解析:这道题太简单了。。。以LeetCode 268.为例,代码如下:

 

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int xor1=0;
        for(int i=0;i<nums.size();++i)
            xor1^=nums[i]^(i+1);
        return xor1;
    }
};

  

神奇的亦或

标签:

原文地址:http://www.cnblogs.com/20143605--pcx/p/5178735.html

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