力扣 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章