leetcode 136 231

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

题意:数组里只有两个出现一次的数,其余是出现两次的数,找出这两个只出现一次的数。

思路:延续上一题的思路,先将所有数相异或,因为相同的数异或为0,所以异或的结果为两个只出现一次的数异或后的结果。然后使用 res = s & (~(s-1)) 从中取出二进制数值位为1的最低位。因为对于这一位,相应的那两个数肯定是不同的。然后将res再与数组里的数与,会得到一组值为0,和一组值不为0的两堆,而这两个数肯定是分开出现在两堆的。最后将这两堆分别做异或操作,得到的值就是只出现一次的数。

注意:运算符的优先级,& 优先级小于 ==

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int s = 0;
        for(int i=0; i<nums.size();i++){
            s ^= nums[i];
        }
        int res = s & (~(s-1));
        vector<int> n(2,0);
        
        for(int i=0; i<nums.size();i++){
            if( (res&nums[i])==0){
                n[0] ^= nums[i];
            }  
            else{
                n[1] ^= nums[i]; 
            }      
        }
        return n;
    }
};
原文地址:https://www.cnblogs.com/Bella2017/p/10910702.html