題目描述:
一個整型數組 nums 裏除兩個數字之外,其他數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)。
示例:
輸入: nums = [4,1,4,6]
輸出: [1,6]或[6,1]
解題過程:
(1)首先考慮特殊情況,nums中只有1個數字出現1次其餘均出現兩次時,使用全員異或即可。原因在於相同的數字異或的結果爲0.
def singleNumber(nums):
single_number = 0
for num in nums:
single_number ^= num
return single_number
(2)當nums中除兩個數字外其他數字均出現1次,可考慮進行分組異或。分組的規則爲:
1)相同的數字分到同一組
2)不同的數字分到不同的組
步驟:
假設nums中不同的兩個數字爲a,b,首先對nums全員進行異或,異或的結果也即是a和b異或的結果,假設結果爲x。x寫作二進制是爲,其中的取值爲0或1。表示與不相等,表示與相等。若以任意不爲0的進行分組,按照第i位對原序列進行分組,若爲0則爲第1組,否則爲第2組。
代碼:
def singleNumber(nums):
res = functools.reduce(lambda x,y: x^y, nums)
div = 1
while (div & res) == 0
div <<= 1
a, b = 0, 0
for n in nums:
if n & div:
a ^= n
else:
b ^= n
return [a,b]
知識點總結:
(1)functools.reduce
的形式一般爲:
functools.reduce(lamda x,y: x與y的表達式, nums)
如果爲整形,則可計算累加,累乘,異或等運算
如果爲列表,則代表列表的拼接。
如果爲多層列表,則相當於降一層維
(2)位運算的掌握