1. 程式人生 > >136. Single Number 找陣列只出現一次的數字

136. Single Number 找陣列只出現一次的數字

Given an array of integers, every element appears twice except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

思路:這道題不像之前的540. Single Element in a Sorted Array是有序序列,更復雜.
(看討論的)用異或(XOR,或記為⊕)
以下結論很吊很有用:

0A = A //A為任意數
AA = 0
即,任意數與0相與都等於其自身,任意數與其自身異或都為0

補充:
(A ⊕ B) ⊕ C = A ⊕ (B ⊕ C)  //結合律
(A ⊕ B) ⊕ (C ⊕ D) = A ⊕ B ⊕ C ⊕ D  //可以去掉括號
A ⊕ B ⊕ C ⊕ D = A ⊕ C ⊕ B ⊕ D  //可以隨意交換
即,只要參與異或運算的成員不變,任意交換異或順序,結果都一樣
若f ⊕ m = G,則:
f ⊕ G = m //推導: f ⊕ G = f ⊕ (f ⊕ m) = f ⊕ f ⊕ m = 0 ⊕ m = m)
m ⊕ G = f //同上

綜上所述,陣列中若存在重複兩次的數i,則其異或結果必為0.因此遍歷陣列,將所有元素異或,最後剩下的必定是出現單次的數.


int singleNumber(vector<int>& nums) {
    for (int i = 1; i < nums.size(); i++) {  //遍歷陣列
        nums[0] ^= nums[i];  //直接用第0號儲存異或結果,節省空間
    }
    return nums[0];
}

py

class Solution:
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
res = nums[0] for i in range(1, len(nums)): res ^= nums[i] return res