2425-所有数对的异或和
给你两个下标从 0 开始的数组 nums1
和 nums2
,两个数组都只包含非负整数。请你求出另外一个数组 nums3
,包含nums1
和 nums2
中 所有数对 的异或和(nums1
中每个整数都跟 nums2
中每个整数 恰好
匹配一次)。
请你返回 nums3
中所有整数的 异或和 。
示例 1:
**输入:** nums1 = [2,1,3], nums2 = [10,2,5,0]
**输出:** 13
**解释:**
一个可能的 nums3 数组是 [8,0,7,2,11,3,4,1,9,1,6,3] 。
所有这些数字的异或和是 13 ,所以我们返回 13 。
示例 2:
**输入:** nums1 = [1,2], nums2 = [3,4]
**输出:** 0
**解释:**
所有数对异或和的结果分别为 nums1[0] ^ nums2[0] ,nums1[0] ^ nums2[1] ,nums1[1] ^ nums2[0] 和 nums1[1] ^ nums2[1] 。
所以,一个可能的 nums3 数组是 [2,5,1,6] 。
2 ^ 5 ^ 1 ^ 6 = 0 ,所以我们返回 0 。
提示:
1 <= nums1.length, nums2.length <= 105
0 <= nums1[i], nums2[j] <= 109
题意分析
对于给定的两个数字,返回其所有数对的异或之和
面对位运算的题目,我们不要慌,把运算过程写出来,答案自然就在眼前
下面以nums1:[a,b]
, nums2:[c,d,e]
, m=len(nums1)
, n=len(nums2)
举例
思路分析
对于此题目的暴力解法为
ans = (a ^ c) ^ (a ^ d) ^ (a ^ e) ^ (b ^ c) ^ (b ^ d) ^ (b ^ e)
a,b为nums1元素,c,d,e为nums2元素
根据交换律可知,原式可变为 (这里是最重要的)
ans = (a ^ a ^ a) ^ (b ^ b ^ b) ^ (c ^ c) ^ (d ^ d) ^ (e ^ e)
由异或操作,相同为0,不同为1可得
(a ^ a ^ a) = a
,(c ^ c)= 0
(注意a 和 c分别属于哪个数组)a
属于nums1
,而式子中a
的数量取决于len(nums2)
;同理c
的数量取决于len(nums1)
由此我们按照如下思路得出结论
- 计算出
nums1
,nums2
数组的异或和 - 若
len(nums2) % 2 == 0
则nums1
数组的n
个异或和为0,否则为1 nums2
同理
- 计算出
根据以上思路即可得出答案
参考代码
1 |
|
1 | class Solution { |
1 | class Solution: |
1 | public class Solution { |
Comments