异或运算&位运算

2020-04-28  本文已影响0人  锦绣拾年

【想转Java刷算法题 不知道合不合适= = 也可以先不转 先看书】
任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0=a⊕0=a。
任何数和其自身做异或运算,结果是 0,即 a ⊕ a=0 a⊕a=0。
异或运算满足交换律和结合律,即 a⊕ b⊕a=b ⊕a ⊕ a=b ⊕(a ⊕ a)=b ⊕0=b a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/single-number/solution/zhi-chu-xian-yi-ci-de-shu-zi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相同的还有LC136

LeetCode刷题 木有写出来,涉及异或 Mark学习

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

 

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:

输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
 

限制:

2 <= nums <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        //遍历一遍就能找到
        int a=0;
        
        vector<int> res;
       for(int i=0;i<nums.size();i++){
           a^=nums[i];
       }//异或结果一定是b异或c,两个数
        int b=0;
        int c=0;
        //涉及到分组,如何分
        int x=1;
        while((x&a)==0){//两个位数相同,&按位与,必须用&
//两个不同的数,必然有不同的一位,那么这一位为1。找到不同的一位
            x<<=1;
        }
        //找到两个位不同的
        
            
        for(int i=0;i<nums.size();i++){
            if(x&nums[i]){//这里也要按位与 不同的那一位为1的,分为一组
                b^=nums[i];
            }else{//不同那一位为0的,分为一组
                c^=nums[i];
            }

                
        }
            res.push_back(b);
            res.push_back(c);
        return res;
    }
};
上一篇下一篇

猜你喜欢

热点阅读