标签:
例如:
给定 nums = [1, 2, 1, 3, 2, 5],返回 [3, 5]
dic[num]=dic.get(num,0)+1
对key进行计数(key分别为nums中的元素),再使用语句:
    for key,value in dic.items():
对元素进行遍历,筛选出value=2的key值,最后:
if value ==1:
    a.append(key)
return a    
输出
class Solution(object):
def singleNumber(self, nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    a=[]
    dic={}
    for num in nums:
        dic[num]=dic.get(num,0)+1
    for key,value in dic.items():
        if value ==1:
            a.append(key)
    return a
首先计算nums数组中所有数字的异或,记为xor,xor为数组中两个只出现1次的数字a与b的异或。肯定不等于 b,那么说明它们的二进制位一定是不完全相同的,所以 xor肯定不为 0。也就是说,a 与 b 一定存在“某一位”,使得在它们中的某个数中是 0,而在另一个数中是 1,这是他们之间的一个差别。 
例如:a=3(0011),b=4(0100),a^b=7(0111)。其中右数第1位=1,即a与b的右数第一位不相同。
令lowbit = xor & -xor,lowbit的含义为xor从低位向高位,第一个非0位所对应的数字
例如假设xor = 7(二进制:0111),则-xor为(二进制:1001,-7的补码,two’s complement)则lowbit =1(二进制:0001)。
若a与lowbit相与=1(a&lowbit==1),即a是a^b中,右数第一位为1的数,所以,a=a&0。 
同理,若b与lowbit相与=0,即b是a^b中,右数第一位为0的数,b=b&0.
xor = reduce(lambda: x, y: x^y, nums)
lowbit = xor & -xor #xor与xor的补码相与
a=b=0
for num in nums:
    if num & lowbit:
        a ^= num
    else:
        b ^=num
return[a,b]
标签:
原文地址:http://blog.csdn.net/neoye125/article/details/51326431