📜  计算从 L 到 R 范围内所有数字的总设置位(1)

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

计算从 L 到 R 范围内所有数字的总设置位

简介

这篇文档将介绍如何编写一个函数或方法来计算从L到R范围内所有数字的总设置位。我们将使用一种简单且高效的方法来实现这个功能。

函数签名

def count_set_bits(L: int, R: int) -> int:
    pass

输入与输出

  • 输入:L和R是两个整数,满足1 <= L <= R <= 10^9。
  • 输出:返回从L到R范围内所有数字的总设置位的数量。

思路

我们需要遍历从L到R范围内的所有数字,并对每个数字计算其二进制表示中设置位(值为1)的个数。然后将所有数字的设置位数量相加,得到最终的结果。

我们可以使用位运算来计算一个数字中设置位的数量。一个常见的方法是使用位掩码和移位操作来完成。具体步骤如下:

  1. 初始化一个变量count为0,用于记录总设置位的数量。
  2. 从L到R遍历每个数字。
  3. 对于每个数字,使用一个位掩码从最低位开始逐个检查位是否为1。
  4. 如果最低位是1,则将count加1。
  5. 将数字向右移动一位,继续检查下一个位。
  6. 重复步骤3到5,直到所有位都被检查完毕。
  7. 返回count作为结果。

代码实现

def count_set_bits(L: int, R: int) -> int:
    count = 0
    for num in range(L, R+1):
        while num > 0:
            count += num & 1
            num >>= 1
    return count

示例

L = 1
R = 10
print(count_set_bits(L, R))  # Output: 17

复杂度分析

  • 时间复杂度:遍历范围内的每个数字,对于每个数字在二进制位上进行检查,因此总时间复杂度为O((R-L+1) * log₂(R))
  • 空间复杂度:只使用了常数个额外变量,因此空间复杂度为O(1)