📅  最后修改于: 2023-12-03 14:56:28.522000             🧑  作者: Mango
在给定包含 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)$ 的空间。