只出现一次的数字 python

#只出现一次的数字1, 其余数字都出现两次
def singleNumber(nums):
    a = 0
    for num in nums:
        a = a^num
    return a
print(singleNumber([1,1,2,2,3,3,8]))
#只出现一次的数字2, 其余数字都出现三次
#1.位运算求解此题;
#2.如果把所有出现三次的数字的二进制表示的每一位加起来,那么每一位都能被3整除;
#3.如果某一位的和能被3整除,那么只出现一次数字的二进制位中对应的那一位就是0,否则就是1;
def singleNumber2(nums):
    bit = [0]*32
    
    for j in range(32):
        for i in range(len(nums)):
            num = nums[i]>>j
            bit[j] += num & 1
    print(bit)
    result = 0
    for i in range(31,-1,-1): #相当于把一个32位二进制数转化为十进制
        result <<= 1
        result += bit[i]%3
    return result
print(singleNumber2([1,1,1,2,2,2,3,3,3,7]))




class Solution(object):
    # 通过这些不重复的元素和的三倍减去原来nums的和,得到的结果就是单个元素的两倍
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        set_nums = set(nums)
        return (3*sum(set_nums)-sum(nums))//2

#有两个数字出现一次, 其余数字都出现二次
#先全部异或一次, 得到的结果, 考察其的某个非0位(比如最高非0位), 那么只出现一次的两个数中, 在这个位上一个为0, 一个为1, 由此可以将数组中的元素分成两部分,重新遍历, 求两个异或值
class Solution(object):
    def singleNumber(self, nums):
        acc = 0
        for i in nums:
            acc ^= i
        print(acc)
        print(bin(acc))
        n = len(bin(acc))-3 #bin(8) '0b1000' 长度减3即右边有几个0
        a,b = 0,0
        for i in nums:
            if i>>n&1:
                a^=i
            else:
                b^=i
        return b,a
s = Solution()
b,a = s.singleNumber([1,1,2,2,3,3,4,6])
print(b,a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值