位運算題--刷題總結

260. 只出現一次的數字 III

給定一個整數數組 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。

示例 :
輸入: [1,2,1,3,2,5]
輸出: [3,5]

方法:異或

我知道異或可以使所有一對一對的值都消失,得到只出現過一次的數的異或值,但是這題的重點是,你得到兩個只出現一次的數之後,如何區分
這裏要提到一個知識:lowbit,它指的是當前數最右邊第一個爲1的bit ,求法 lowbit(s) = s & -s
之後可以通過這個 lowbit 把所有的值分爲兩組,而兩個只出現一次的值就分別在兩個不同的小組,再對每個小組進行異或即可!

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums)
    {
        int sign = 0;
        //取得數組中兩個唯一數的按位異或結果
        for (int i = 0; i < nums.size(); i++)
        {
            sign ^= nums[i];
        }
        //獲取區分兩個唯一數的比特位所代表的值
        //也可以寫成:sign &= (~sign) + 1
        sign &= -sign;
        int n1 = 0, n2 = 0;
        //通過標識,區分兩個數組
        for (int i = 0; i < nums.size(); i++)
        {
            if ((nums[i] & sign) == sign)
                n1 ^= nums[i];
            else
                n2 ^= nums[i]; ;
        }
        return { n1,n2 };
    }
};

268. 缺失數字

這道題是我沒想到用位運算的,這題告訴了一個道理,位運算的異或可以找那個唯一數!!!(唯一的意思是,和別的數字出現的頻率不一樣!!!)
給定一個包含 0, 1, 2, …, n 中 n 個數的序列,找出 0 … n 中沒有出現在序列中的那個數。

示例 1:
輸入: [3,0,1]
輸出: 2

示例 2:
輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8

方法:

只有一個數字沒出現,假如在裏面把0,1,2…n再加入一遍,那麼異或的值就是隻出現一次的值,就是要求的值!

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        // int arr[n+1] = {0};
        // for(int i = 0;i < n;i++){
        //     arr[nums[i]] ++;
        // }
        // int count = 0;
        // for(int i = 0;i < n+1;i++){
        //     if(arr[i] == 0) return i;
        // }

        // return 0;

        int a = 0;
        for(int i = 0;i < n+1;i++){
            a ^= i;
        }
        for(int i = 0;i < n;i++){
            a^= nums[i];
        }

        return a;
    }
};

未完待續…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章