LeetCode 260 只出现一次的数字 III(超级清晰的解释)

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

示例 :

输入: [1,2,1,3,2,5]
输出: [3,5]

注意:

  1. 结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
  2. 你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

 【思路】左神这道题讲的十分清晰:

LeetCode 260 只出现一次的数字 III(超级清晰的解释)

【代码】

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int dp = 0;
        for(int num: nums)
            dp = dp ^ num;
        int s = 1;
        while((dp & s) == 0)//找到最右侧的1,这一位表明这两个数的这一位一定不同
        {
            s = s<<1;
        }
        unsigned int res1 = 0, res2 = 0;
        for(int num: nums)
        {
            if((num & s) == s)//只与这一位为1的数进行异或,最终得到的肯定为两个数中这一位为1的那个数
            {
                res1 = res1 ^ num;
            }
        }
        res2 = res1 ^ dp;//因为 dp是 res1 ^ res2
        return vector<int>{res1, res2};
    }
};