1
這里使用到了python中的位運算佛寿,首先應(yīng)該明白任何數(shù)和0做異或都是其本身默责,和其本身做異或都是0壶熏。然后很快就能想到進(jìn)行分組句柠。將數(shù)字分為兩組,第一組中都是重復(fù)出現(xiàn)的數(shù)字棒假,外加一個單獨的數(shù)字溯职;第二組中也是重復(fù)出現(xiàn)的數(shù)字,外加一個單獨的數(shù)字帽哑。這樣將第一組中所有元素做異或得到的就是單獨的那個數(shù)字谜酒,第二組中也類似。這樣就能找出那兩個單獨的數(shù)字祝拯。
接下來就是如何進(jìn)行分組甚带,我想了很久都沒想出來她肯,看官方答案才恍然大悟。
將所有元素異或鹰贵,結(jié)果必不為0晴氨,轉(zhuǎn)化成二進(jìn)制數(shù)后必有至少一個位為1,隨便選取一個為1的位碉输,那兩個不同的元素在這個位上不同籽前,這樣就一定有一個為0,一個為1敷钾,這個通過0枝哄,1就分開了這兩個不同的元素。其他元素也一樣阻荒,重復(fù)元素的所有位都相同挠锥,根據(jù)這一位是0還是1就能達(dá)到分組的效果。
代碼如下:
class Solution:
def singleNumbers(self, nums: List[int]) -> List[int]:
single_res = 0
a,b = 0,0
bit = 1
for i in nums:
single_res ^= i
# single_res = functools.reduce(lambda x, y: x ^ y, nums)
while bit & single_res == 0:
bit <<= 1
for i in nums:
if i & bit:
a ^= i
else:
b ^= i
res = [a,b]
return res
python按位操作
&:按位與
|:按位或
^:按位異或
~:非
<<:左移
>>:右移