📜  [0, N] 范围内的整数 K 的计数,使得 (K XOR K+1) 等于 (K+2 XOR K+3)(1)

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

[0, N] 范围内的整数 K 的计数

题目描述

给定一个非负整数 N,计算[0, N]区间内有多少个整数 K 满足如下条件:

(K XOR K+1) 等于 (K+2 XOR K+3)

其中,XOR 代表按位异或。

解题思路

对于 K,它的下一位 K+1 和它的下下位 K+2 以及 K+3 三位只会存在以下四种情况:

  • 00,01,10,11
  • 00,01,11,10
  • 10,11,00,01
  • 11,10,01,00

而 K XOR K+1 的结果,只有01和10两种情况。同理,K+2 XOR K+3 的结果也只有01和10两种情况。

结合以上推论,可以得出以下结论:

  • 当 K 的某一位上是 0 时,它的下一位和下下位只能是 01 或 10,不能是 00 和 11。
  • 当 K 的某一位上是 1 时,它的下一位和下下位只能是 00 或 11,不能是 01 和 10。

因此,我们可以遍历 K 的二进制表示中的每一位,并对于每一位分类讨论,计算出满足条件的情况数,并将它们相加得出最终结果。

代码实现
def count_K(N: int) -> int:
    # 将 N 转为二进制字符串
    bin_str = bin(N)[2:]
    # 记录满足条件的情况数
    count = 0
    # 遍历 K 的二进制表示
    for i in range(len(bin_str)):
        # 当前位为 0
        if bin_str[i] == '0':
            # 下一位和下下位只能是 01 或 10
            if i == 0 or bin_str[i - 1] == '1':
                count += 2 ** (len(bin_str) - i - 1)
        # 当前位为 1
        else:
            # 下一位和下下位只能是 00 或 11
            if i == 0 or bin_str[i - 1] == '0':
                count += 2 ** (len(bin_str) - i - 1)
    return count
复杂度分析
  • 时间复杂度:$\mathcal{O}(\log N)$
  • 空间复杂度:$\mathcal{O}(1)$