LeetCode 1835. Find XOR Sum of All Pairs Bitwise AND (鲜为人知的XOR和AND公式)

该博客探讨了LeetCode 1835题目的解法,重点在于利用位运算的特性,特别是XOR和AND的结合。通过示例解释了题目要求的两两配对AND操作后进行XOR求和的过程,并指出可以转换思路以降低时间复杂度。博主分享了相关位运算法则,强调理解和记忆这些公式的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

题目链接 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)

解题后的思考

有些东西不需要知道为什么,背下来,记住就好,比如今天提到的公式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值