📅  最后修改于: 2023-12-03 14:38:56.583000             🧑  作者: Mango
给定一个非负整数 N,计算[0, N]区间内有多少个整数 K 满足如下条件:
(K XOR K+1) 等于 (K+2 XOR K+3)
其中,XOR 代表按位异或。
对于 K,它的下一位 K+1 和它的下下位 K+2 以及 K+3 三位只会存在以下四种情况:
而 K XOR K+1 的结果,只有01和10两种情况。同理,K+2 XOR K+3 的结果也只有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