力扣 645. 错误的集合 位运算

https://leetcode-cn.com/problems/set-mismatch/

在这里插入图片描述

思路:做法很多,只考虑空间O(1)O(1)的方法。设答案为aba、b,数组的异或和为sumsum,再对所有的1<=i<=n1<=i<=n做一遍sum xor isum\ xor\ i,得到的结果就是a xor ba\ xor\ b,现在考虑怎么把他们分离出来。我们找到a xor ba\ xor\ b的为11的最低位,然后依据此位把原数组和[1,n][1,n]分成两个部分,每个部分单独做一次异或和就可以得到aba、b了,现在只需要考虑它们的顺序问题,显然遍历一遍数组即可。

class Solution {
public:
    vector<int> findErrorNums(vector<int>& nums) {
        int siz=nums.size(),sum=0;
        for(int i=0;i<siz;i++)
            sum^=(i+1)^nums[i];
        int pos=1;
        while(!(sum&pos))
            pos<<=1;
        int a=0,b=0;
        for(int i=0;i<siz;i++)
        {
            if(nums[i]&pos)
                a^=nums[i];
            else
                b^=nums[i];
            if((i+1)&pos)
                a^=(i+1);
            else
                b^=(i+1);
        }
        vector<int> ans{a,b};
        for(int i=0;i<siz;i++)
        {
            if(nums[i]==b)
            {
                swap(ans[0],ans[1]);
                break;
            }
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章