260、只出现一次的数字II

1、位与异或


根据相同数异或为零以及零与任何数异或仍是其本身的性质,可以得到两个只出现一次数字的异或值,且两个数的二进制位中必然有一位是不相同的,因为其不能为0。

将列表中的值遍历与其中低位第一个为1的数进行与运算,可以将其分为两组。将两组分别进行异或,最后得到两个只出现一次的数字。

低位第一个为1的位数可以通过其与其反值进行与运算得到。

代码

class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        xor = 0
        for num in nums:
            xor ^= num

        mask = xor & (-xor)
        type1=type2=0
        for num in nums:
            if num & mask:
                type1 ^= num
            else:
                type2 ^= num
        return [type1, type2]

2、暴力破解

直接遍历,使用另外的新列表,如果在新列表中已经存在相应的值,将其从新列表中移除;如果不存在,则添加进新列表。最后新列表中剩下的就是需要的结果。

代码

class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        num1 = []
        for num in nums:
            if num not in num1:
                num1.append(num)
            else:
                num1.remove(num)
        return num1

链接:https://leetcode-cn.com/problems/single-number-iii/solution/260-zhi-chu-xian-yi-ci-de-shu-zi-ii-by-s-juz8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值