题目描述:
题解一:dict
1.利用list result保存最终只出现一次的两个数字,numsdict记录nums每个数字num出现的次数。
2.遍历nums,如果当前num不在numsdict中,说明num是只出现一次的数字,或者是出现两次数字的第一次,将num加入result,然后numsdict[num]设置为1。如果num在numsdict中,说明num已经在数组中出现第二次,如果之前num加入了result,则将num从result去掉。
class Solution: def singleNumbers(self, nums: List[int]) -> List[int]: numsdict = {} result = [] for num in nums: if num in numsdict: if num in result: result.remove(num) else: numsdict[num]=1 result.append(num) return result
题解二:位运算
1.a^a=0 a^0=a,即一个数和自身做异或结果为0,一个数和0做异或操作结果为自身。
2.数组nums中所有数字做异或,出现两次的数字结果亦或结果均为0,因此nums中所有数字的异或结果ret为其中只出现一次的两个数字的异或结果。
3.找到ret中为1的位置idx,将nums中数字按照idx为0和为1,分为两组。
4.因为两个只出现一次的数字不同,所以这两个数字的第idx位不同。因此第一组数字为:一个出现一次的数字+若干对出现两次的数字,第二组:另一个只出现一次的数字+若干对出现两次的数字。
5.对第一组所有数字做异或结果为第一个只出现一次的数字,第二组所有数字做异或,结果为第二个只出现一次的数字。
class Solution(object): def singleNumbers(self, nums): ret = 0 idx = 0 for n in nums: ret^=n while ret&1==0: idx = idx+1 ret = ret>>1 r1 = 0 r2 = 0 for n in nums: if (n>>idx)&1==0: r1^=n else: r2^=n return [r1,r2]