起因于 Single Number:一個(gè)數(shù)字在數(shù)組中只出現(xiàn)了一次,其它數(shù)字都出現(xiàn)了兩次,找到這個(gè)數(shù)字。
def singleNumber(nums):
res = 0
for i in nums:
res ^= i
return res
兩個(gè)相同的數(shù)相與會(huì)抵消,最后只會(huì)剩下只出現(xiàn)一次的那個(gè)數(shù)。邏輯上感覺(jué)很好理解,但是具體我就容易懵,先暫且記錄一下吧。
還有兩個(gè)數(shù)字在數(shù)組中只出現(xiàn)了一次,其它出現(xiàn)了兩次。
思路是這樣:先將所有數(shù)字異或一遍,那么最后留下來(lái)的數(shù)字就是那兩個(gè)只出現(xiàn)一次數(shù)字的異或。
根據(jù)這個(gè)數(shù)而應(yīng) 2 進(jìn)制從右邊起第一個(gè) 1,將原數(shù)組拆成 2 份,然后分別異或可以得到結(jié)果。
# 大神代碼
def singlenumber3(nums):
tmp = singleNumber(nums)
res = [0, 0]
# 得到不同的那一位為 1
mask = tmp &(-tmp)
for i in nums:
if i & mask:
res[0] ^= i
else:
res[1] ^= i
return res
這里想不明白的是 mask = tmp &(-tmp) 是如何得到其二進(jìn)制最右邊的 1?