【位运算】Leetcode 2032. 至少在两个数组中出现的值

Leetcode 2032. 至少在两个数组中出现的值

给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 元素各不相同的 数组,且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。
示例:
nums1 = [1,1,3,2]
nums2 = [2,3]
nums3 = [3]

----------------------------------

ans = [2,3]

本篇主要记录一下位运算解法:

from collections import defaultdict
class Solution:
    def twoOutOfThree(self, nums1, nums2, nums3):
        mask = defaultdict(int)
        for i, nums in enumerate((nums1, nums2, nums3)):
            for x in nums:
                mask[x] |= 1 << i
        return [x for x, m in mask.items() if m & (m - 1)]
        # return [x for x, m in mask.items() if m!=1 and m!=2 and m!=4]

mask = defaultdict(int)

当元素不在字典中时自动新建一个键值对,
若不采用这种定义,则功能与以下语句相当:

mask = {}
if num not in mask:
	mask[num] = 1
else:
	pass

mask[x] |= 1 << i
即 mask[x] = mask[x] | 1 << i # 表示或运算
1 << i
表示将(二进制数)1 左移i位

i=0时,结果为1;i=1时,结果为10(二进制)=2(十进制);i=2时,结果为100(二进制)=4(十进制)
这里i表示第几个list,当数字x出现在第几个list中,二进制下的某一位为1,否则为0,
实例中 mask={1:1(001), 3:7(111), 2:3(011)}

m & (m - 1)

表示m与m-1的与运算,根据题意,当数字仅在一个list中出现的情况为1(001),2(010),4(100),此时m & (m - 1)的结果为0
官方题解用这种方式筛选出仅出现在一个list中的数,可能是因为上述三种情况-1后,原先为1的位会变成0,而原先为1的位右侧的0将变成1,此时与运算的结果显然为0,太妙了!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值