📌  相关文章
📜  门| Sudo GATE 2020 Mock I(2019 年 12 月 27 日)|第 58 题(1)

📅  最后修改于: 2023-12-03 15:28:47.165000             🧑  作者: Mango

题目描述

给定两个整数,leftright,表示区间 [left, right] (包括 leftright)。

返回此区间内所有数字的按位 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$ 个二进制位上的值为:

  • 如果 $cnt$ 为奇数,则该位的结果为 $1$。
  • 如果 $cnt$ 为偶数,则该位的结果为 $0$。

当前枚举到的二进制位的结果为所有计算得到的二进制位结果的异或和。

代码实现
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
复杂度分析
  • 时间复杂度: $O(32(n-m))$,其中 $n-m$ 表示区间的长度,在最坏情况下 $n-m$ 为最大十进制数所对应的二进制位数,即 32 位。因此时间复杂度为 $O(32(n-m))$。
  • 空间复杂度: $O(1)$。
总结

此题要求我们求解一个区间内所有数字的按位 XOR 结果。我们可以将所有数字按照二进制的位分别进行考虑,来确定每一位上的值。这样,就可以在遍历一遍所有数字,同时枚举每个二进制位上的值得到题目的求解结果。