LeetCode第260题---只出现一次的数iii

LeetCode链接: link.
在这里插入图片描述
解题思路:

  1. 只有两个元素出现一次,其它的元素都出现两次.

  2. 全部元素异或消掉出现两次的数字. 异或的结果为i.

  3. 此时就用这个i去任意找一个bite位为1的,就可以将数组才分为这个bite位为1的和这个bite位不为1的。(数组全部异或完以后的这个i值,里面的每一个bite位都是两个数独有的)

  4. 那么再进行组内异或,就可以得到那个单独值,也就把异或的结果值进行了拆分。

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int i = 0;
        for(auto& e : nums)
        {
            i ^= e;
        }
        //此时数组中重复的数就被全部异或掉了,剩下的是两个不同元素异或的结果

        //这里不要担心,总会找到那个bite位为1的值,找不到就出现问题了
        int m = 0;
        while(m<32)
        {
            if(i & (1<<m))
                break;
            else
                ++m;
        }

        //此时就通过那个找到的bite位的1,将数组中所有的数,划分为了两个阵营的,一个是这个bite为有1,一个是没有的
        int x1 = 0,x2 = 0;
        for(size_t i = 0;i<nums.size();++i)
        {
            if(nums[i] & (1<<m))
            {
                x1 ^= nums[i];
            }
            else
            {
                x2 ^= nums[i];
            }
        }
		
		//为了节省代码,这里直接返回了一个匿名对象,且匿名对象中的数为x1和x2
        return  vector<int>{x1,x2};
    }
};

版权声明:本文为MEANSWER原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。