📌  相关文章
📜  在给定数组的索引范围 [L, R] 中查询按位 AND(1)

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

在给定数组的索引范围 [L, R] 中查询按位 AND

在给定的数组nums中,我们需要查询在索引范围[L, R]之间的所有元素的按位与(AND)操作的结果。 如果nums[L] AND nums[L+1] AND ... AND nums[R]的结果是val,我们需要找到val的值并返回。

解决方案

我们可以使用位运算来解决这个问题,因为位运算符操作的是二进制数的每一位。

  • 对于一个字节(8位),所有位的和为 255(11111111b),AND 运算的结果是原始值。
  • 如果有两个或更多的字节,AND运算的结果将保留所有字节(或十六进制数中所有位)的公共位。 其他位将被清零。

如果我们将范围[L, R]中的所有元素转换为二进制,并逐位进行按位AND运算,则可找到val。

class Solution(object):
    def rangeBitwiseAnd(self, nums, left, right):
        """
        :type nums: List[int]
        :type left: int
        :type right: int
        :rtype: int
        """
        # find the common bits between left and right
        # e.g. 5 = 101, 7 = 111, the common bits are 100
        while left < right:
            right &= (right - 1)
        return right & nums[left]
复杂度分析

时间复杂度: O(log n),其中n是right-left的位数。在每个循环迭代中,right减少一半(即右移一位)。因此,我们需要最多 O(log n) 次迭代。

空间复杂度: O(1)。我们只需要常量级别的空间来存储变量。