260. Single Number III [leetcode]

每次遇得這種位操作的新題,都不會做。

很無奈。看了大神的講解才恍然大悟。

哎。

原理就是對數組進行分組,使得兩個單獨的數a、b被分到不同的組。再在不同的組裏面通過異或的操作分別得出兩個數。

怎麼樣分組呢? 尋找a與b的不同點。此時,不用考慮其他數,因爲其他數都是成雙的,相同的數一定會被分到同一組。

通過異或操作我們可以得到a與b不同的位。我們選取a^b的最低不爲0的位。

通過判斷每個數在該位上是否爲零,對數進行分組。

真的很妙。


code:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        if (nums.size() < 3) return nums;
        vector<int> res(2,0);
        int diff = 0;
        for (auto i : nums) diff ^= i;
        diff &= -diff;
        for (auto i : nums) {
            if (i & diff) res[0] ^= i;
            else res[1] ^=i;
        }
        return res;
        
    }
};


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