📅  最后修改于: 2023-12-03 15:28:47.165000             🧑  作者: Mango
给定两个整数,left
和 right
,表示区间 [left, right]
(包括 left
和 right
)。
返回此区间内所有数字的按位 XOR
结果(XOR
运算为二进制按位异或运算)。
输入: left = 1, right = 5
输出: 1 ^ 2 ^ 3 ^ 4 ^ 5 = 7
对于区间 [left, right]
中的所有数字,如果我们将它们拆分成二进制数的位,那么对于某一位,若这个区间中的数字在该位上出现的次数为奇数,则该位的结果为 1,否则为 0。那么,对于该区间中的所有数字的按位 XOR
结果就可以用每个二进制位上的结果再拼接起来得到。具体来说,我们可以对 [left, right]
中的每一个数,从低到高地枚举每个二进制位是否为 $1$,统计在该二进制位为 $1$ 的数字的出现次数。假设当前枚举到第 $k$ 个二进制位,共统计到该二进制位为 $1$ 的数字有 $cnt$ 个。那么此时在第 $k$ 个二进制位上的值为:
当前枚举到的二进制位的结果为所有计算得到的二进制位结果的异或和。
class Solution:
def rangeXor(self, left: int, right: int) -> int:
res = 0
for k in range(32, -1, -1): # 枚举二进制位
cnt = 0 # 记录当前二进制位上 1 的个数
for i in range(left, right + 1): # 统计区间中第 k 个二进制位为 1 的数字个数
cnt += (i >> k) & 1
res = res * 2 + (cnt % 2) # 根据个数的奇偶性确定当前位的值
return res
此题要求我们求解一个区间内所有数字的按位 XOR
结果。我们可以将所有数字按照二进制的位分别进行考虑,来确定每一位上的值。这样,就可以在遍历一遍所有数字,同时枚举每个二进制位上的值得到题目的求解结果。