简介
题目链接 LeetCode 1835. Find XOR Sum of All Pairs Bitwise AND
本题的标签是Math
,但实际上用到的是位运算的规律。这道题周赛的时候放出来,虽然是Hard
但还是很多人做出来了。也许是熟悉这个特殊的xor
公式,也许是连蒙带猜,不重要,我们一起来看看吧。
注意:文章中一切注解皆为Python代码
理解题目
题目非常简单。给定两个数列,要求先做两两对应的二进制AND操作,然后对于生成的数列,做异或XOR操作,最终返回两个操作之后的结果,是一个数字。下面看一下官方的例子:
Input: arr1 = [1,2,3], arr2 = [6,5]
Output: 0
Explanation: The list = [1 AND 6, 1 AND 5, 2 AND 6, 2 AND 5, 3 AND 6, 3 AND 5] = [0,1,2,0,2,1].
The XOR sum = 0 XOR 1 XOR 2 XOR 0 XOR 2 XOR 1 = 0.
题目剖析+思考过程
这题基本不用剖析,或者思考,可以说会做就是会做,不会做想了基本也没用。主要考查的是AND和XOR的以下属性:
# 假定有两个数列,a和b;a1,a2...是a中的元素,b1,b2...是b中的元素,那么如下结论成立
(a1^a2) & (b1^b2) = (a1&b1) ^ (a1&b2) ^ (a2&b1) ^ (a2&b2)
左边是两个数列内部先求异或再求和,右边是两两对应先求和再求异或。题目要求我们按照右边去求,但是我们可以按照左边来求以降低时间复杂度。左边时间复杂度O(A+B)
,右边时间复杂度O(A*B)
。
不要去问为什么,就好像你知道
(a1+a2) * (b1+b2) = (a1*b1) + (a1*b2) + (a2*b1) + (a2*b2)
成立,但你不知道如何证明一样,都是数学公式,记住就好。
代码实现(附注释)
class Solution:
def getXORSum(self, arr1: List[int], arr2: List[int]) -> int:
return reduce(operator.xor, arr1) & reduce(operator.xor, arr2)
解题后的思考
有些东西不需要知道为什么,背下来,记住就好,比如今天提到的公式。