美文网首页
异或运算&位运算

异或运算&位运算

作者: 锦绣拾年 | 来源:发表于2020-04-28 23:00 被阅读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;
        }
    };
    

    相关文章

      网友评论

          本文标题:异或运算&位运算

          本文链接:https://www.haomeiwen.com/subject/idgiwhtx.html