136. Single Number 找陣列只出現一次的數字
阿新 • • 發佈:2019-02-15
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,或記為⊕)
以下結論很吊很有用:
0 ⊕ A = A //A為任意數
A ⊕ A = 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