python - 如何统计数字的总设置位数

  • 给定一个正整数 A,任务是计算从 1 到 A 的所有数字的二进制表示中设置位的总数。
 A = 3
 DECIMAL    BINARY  SET BIT COUNT
    1          01        1
    2          10        1
    3          11        2

1 + 1 + 2 = 4

  • 我得到了正确的输出

代码如下

def solve(A):
     ad = ''
     for i in range(A + 1):
         ad += str(bin(i).replace('ob',''))
     return ad.count('1')

按位

  def solve(A):
        count = 0
        for i in range(A + 1):
            while i > 0:
                i= i & (i-1)
                count += 1
        return (count)
  • 在这两种情况下,我都收到了 Time Limit Exceeded.

最佳答案

这在 O(log(A)) 中有效,所以你不应该超过时间限制:

def solve(A):
  count = 0
  n = A
  i = 0
  while n > 0:
    if (n & 1) == 1:
      f = ((1 << i) >> 1) * i
      g = (((1 << i) - 1) & A) + 1
      count += f + g
    n >>= 1
    i += 1
  return count

排除0到2^n之间的集合位总数为2^(n-1)*n。因为在这种特殊情况下,每列中设置了 50% 的位,其他 50% 未设置,并且有 n 列。

对于一个不是 2 的幂的数 A,我们可以将计算分解为几遍,一个用于所讨论的数 A 中的每个设置位,并使用 2 的精确幂(变量 f)的表达式.我们还必须每次都处理额外的 1 列(变量 g)。

Schema to see why it works

https://stackoverflow.com/questions/68846038/

相关文章:

python - 将字符串数据传递给 matplotlib API 时会绘制什么?

amazon-web-services - AWS - 安全组是否足够或是否需要私有(private

awk - 使用 sed(或 awk 或 tr)将换行符\n 替换为表达式

c++ - 编译时 bool 值 C++ 未知的 constexpr 函数参数

java - 如何将带逗号的字符串转换为整数和 double

java - 比较2 ArrayList java

r - 导出多个匹配模式

vue.js - 如何使用 Nuxt 中间件重定向到外部站点?

python - 将重复列名列表和值列表转换为数据框

reactjs - React useEffect 钩子(Hook)没有清除间隔