Leetcode 2032. 少なくとも 2 つの配列に出現する値
3 つの整数配列 nums1、nums2、および nums3 が与えられた場合、少なくとも 2 つの配列に現れるすべての値で構成される個別の要素を持つ配列を構築して返してください。配列内の要素は任意の順序で配置できます。
例:
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]
マスク = デフォルトディクテーション(int)
要素が辞書にない場合、新しいキーと値のペアが自動的に作成されます。
この定義が使用されない場合、関数は次のステートメントと同等です。
mask = {
}
if num not in mask:
mask[num] = 1
else:
pass
マスク[x] |= 1 << i
はマスク[x] = マスク[x] | 1 << i # は OR 演算を意味します
1 << i は
(2 進数) 1 をi ビット左にシフトすることを意味します
i=0 の場合、結果は 1、i=1 の場合、結果は 10 (2 進数)=2 (10 進数)、i=2 の場合、結果は 100 (2 進数)=4 (10 進数)、i は数値を表しますリストの
、数値 x がどのリストに現れるとき、バイナリの下の特定のビットは 1 で、それ以外の場合は 0 です。例では、
mask={1:1(001), 3:7(111), 2:3( 011)}
m & (m - 1)
m と m-1 の AND 演算を示します。質問の意味によれば、その数字が 1 つのリストにのみ出現する場合は、1(001)、2(010)、4(100) となり、このとき m & (m - 1) 結果は 0 です。
公式の問題解決策では、この方法を使用して 1 つのリストにのみ表示される数値を除外します。これは、上記の 3 つのケースが原因である可能性があります -1、元々 1 だったビットが 0 になります、元々 1 だったビットの右側のビットは 0 になります。0 は 1 になります。このときの AND 演算の結果は明らかに 0 です。素晴らしいです。