20231016成长日记

1. leetcode刷题笔记

这个如果用哈希表,那就和昨天的差不多。位运算的思路就难理解一点。

class Solution:
    def singleNumber(self, nums: List[int]) -> List[int]:
        freq = Counter(nums)
        rslt = []
        for c, n in freq.items():
            if n==1:
                rslt.append(c)
        return rslt

位运算方法

将nums中所有数相异或,x = x1 ⊕ x2 ⊕ …… ⊕xn,由于相同的两个数配对相消,剩下的就是两个不相等的数(设为x01,x02)的异或结果:x = x01⊕x02

① 1个数x与自己的相反数相与,x&(-x),得到的数的二进制表示只有一位为1,而该位是x的最低为1的一位(记为i)。

eg:

 5&(-5) = 0101 & 1011 = 0001        (i = 0)

x = x01⊕x02,第i位同时也是x01和x02不相等的最低位

② 以这个作为特征来将nums中的数字分为两类:第i为为1的;第i位为0的。则x01和x02会被分到不同组。

在这两个组里分别求异或和,最终得到的两个数即为x01和x02

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值