leetcode每日一題——數組中數字出現的次數

題目描述:
一個整型數組 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寫作二進制是爲xkxk1...x2x1x_{k}x_{k-1}...x_{2}x_{1},其中xix_{i}的取值爲0或1。xi=1x_{i}=1表示aia_{i}bib_{i}不相等,xi=0x_{i}=0表示aia_{i}bib_{i}相等。若以任意不爲0的xix_{i}進行分組,按照第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)位運算的掌握

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章