[LeetCode] Single Number III 單獨的數字之三
阿新 • • 發佈:2018-12-29
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:
- The order of the result is not important. So in the above example,
[5, 3]
- 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; } };
類似題目:
參考資料: