1. 程式人生 > >[LeetCode] Single Number III 單獨的數字之三

[LeetCode] Single Number III 單獨的數字之三

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

Note:

  1. The order of the result is not important. So in the above example, [5, 3]
    is also correct.
  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

這道題是之前那兩道Single Number 單獨的數字和 Single Number II 單獨的數字之二的再次延伸,說實話,這類位操作Bit Manipulation的題,如果之前沒有遇到過類似的題目,楞想是很難相出來的,於是我只能上網搜大神們的解法,發現還真是巧妙啊。這道題其實是很巧妙的利用了

Single Number 單獨的數字的解法,因為那道解法是可以準確的找出只出現了一次的數字,但前提是其他數字必須出現兩次才行。而這題有兩個數字都只出現了一次,那麼我們如果能想辦法把原陣列分為兩個小陣列,不相同的兩個數字分別在兩個小陣列中,這樣分別呼叫Single Number 單獨的數字的解法就可以得到答案。那麼如何實現呢,首先我們先把原陣列全部異或起來,那麼我們會得到一個數字,這個數字是兩個不相同的數字異或的結果,我們取出其中任意一位為‘1’的位,為了方便起見,我們用 a &= -a 來取出最右端為‘1’的位,然後和原陣列中的數字挨個相與,那麼我們要求的兩個不同的數字就被分到了兩個小組中,分別將兩個小組中的數字都異或起來,就可以得到最終結果了,參見程式碼如下:

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

類似題目:

參考資料: