📌  相关文章
📜  相邻数字的按位与等于 0 的 N 位数字的计数(1)

📅  最后修改于: 2023-12-03 14:56:28.522000             🧑  作者: Mango

相邻数字的按位与等于 0 的 N 位数字的计数

在给定包含 n 个非负整数的数组 nums 中,计算相邻数字的按位与等于 0 的 N 位数字的计数,并返回该计数。

示例

输入: nums = [5, 8, 3, 7, 101]

输出: 4

解释:

5 和 8, 8 和 3, 3 和 7, 7 和 101 相邻数字的按位与为 0 的 N 位数字分别为:

0101 & 1000 = 0000

1000 & 0011 = 0000

0011 & 0111 = 0011

0111 & 1101 = 0101

故有 4 个按位与等于 0 的 N 位数字,因此返回 4。

解题思路

首先,我们需要知道按位与运算符(&)的基本运算规则:当两个二进制数的对应位都为 1 时,结果的对应位为 1,否则为 0。

如果相邻两个数字的按位与等于 0 的 N 位数字,则说明这两个数字的二进制表示中,有 N 个连续的 0。

因此,我们遍历数组中的数字,并将其与它相邻的数字按位与,然后统计其中二进制表示中 0 的连续个数。

代码片段
class Solution:
    def countBitwiseAnd(self, nums: List[int]) -> int:
        count = 0
        for i in range(len(nums) - 1):
            temp = nums[i] & nums[i + 1]
            # 将 temp 转化为 2 进制字符串
            binary = bin(temp)[2:]
            zeros = binary.split('1')
            # 统计连续的 0 的数量
            for z in zeros:
                if len(z) > count:
                    count = len(z)
        return count
复杂度分析

时间复杂度:$O(nlogm)$,其中 $m$ 是最大数字的二进制位数。遍历数组需要 $O(n)$ 时间,而将数字转化为二进制字符串需要 $O(logm)$ 时间。

空间复杂度:$O(logm)$。我们需要保存每个数字的二进制字符串及其分割得到的 0,这样就需要 $O(logm)$ 的空间。