###### tags: `Leetcode` `medium` `bit` `python` `c++` # 260. Single Number III ## [題目連結:] https://leetcode.com/problems/single-number-iii/description/ ## 題目: Given an integer array ```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. You can return the answer in **any order**. You must write an algorithm that runs in linear runtime complexity and uses only constant extra space. * Each integer in nums will appear twice, only two integers will appear once. **Example 1:** ``` Input: nums = [1,2,1,3,2,5] Output: [3,5] Explanation: [5, 3] is also a valid answer. ``` **Example 2:** ``` Input: nums = [-1,0] Output: [-1,0] ``` **Example 3:** ``` Input: nums = [0,1] Output: [1,0] ``` ## 解題想法: * 給一數組中,每個數都恰好兩個,只有兩個數皆只有出現一次 * 求該兩個數 * 只能用線性time、常數space * Bit判斷: * Step1: * 將所有數xor **偶數的會全部消掉** ``` python= mark=0 for i in nums: mark ^= i ``` * Step2: **技巧** * 最後得到的mark值為那兩個單一數的xor * 用 **mark&(-mark)** 去判斷最低位為1者 * key = mark&(-mark) * Step3: 再次遍歷整個數列 * 區分兩數為 * key&該數 = 0 * key&該數 = 1 * 將分類結果均進行xor ## Python: ``` python= class Solution(object): def singleNumber(self, nums): """ :type nums: List[int] :rtype: List[int] """ #step1:將所有數xor 偶數的會全部消掉 mark=0 for i in nums: mark ^= i #step2:技巧: 最後得到的mark值為那兩個單一數的xor #用mark&-mark去找到最低位為1者 key = mark&(-mark) #區分兩數為與key& =0 or key& = 1 res = [0,0] for n in nums: if (n&key)==0: res[0]^=n else: res[1]^=n return res nums = [1,2,1,3,2,5] result = Solution() ans = result.singleNumber(nums) print(ans) ``` ## C++: * 要用**unsigned int**,否則會runtime error * runtime error: negation of -2147483648 cannot be represented in type 'int' ``` cpp= class Solution { public: vector<int> singleNumber(vector<int>& nums) { unsigned int mark=0; for (int val:nums){ mark^=val; } unsigned int key=(mark)&(-mark); vector<int> res(2,0); for (int val:nums){ if ((val&key)==0) res[0]^=val; else res[1]^=val; } return res; } }; ```