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,太妙了!