Algorithm 这一解决方案背后的直觉;最大化XOR“;
以下是问题陈述: 给定两个整数:L和R, 求给定的A或B的最大值,L≤ A.≤ B≤ R 输入格式: 输入包含两行,L出现在第一行中。 R在第二行 限制条件: 1.≤ L≤ R≤ 一千 输出格式 问题陈述中提到的最大值 资料来源: 以下是针对上述问题的一个独特解决方案:Algorithm 这一解决方案背后的直觉;最大化XOR“;,algorithm,logic,bit-manipulation,bitwise-operators,xor,Algorithm,Logic,Bit Manipulation,Bitwise Operators,Xor,以下是问题陈述: 给定两个整数:L和R, 求给定的A或B的最大值,L≤ A.≤ B≤ R 输入格式: 输入包含两行,L出现在第一行中。 R在第二行 限制条件: 1.≤ L≤ R≤ 一千 输出格式 问题陈述中提到的最大值 资料来源: 以下是针对上述问题的一个独特解决方案: def maxXOR(L,R): P = L^R ret = 1 while(P): # this one takes (m+1) = O(logR) steps ret <<
def maxXOR(L,R):
P = L^R
ret = 1
while(P): # this one takes (m+1) = O(logR) steps
ret <<= 1
P >>= 1
return (ret - 1)
print(maxXOR(int(input()),int(input())))
def maxXOR(左,右):
P=L^R
ret=1
而(P):#这一步需要(m+1)=O(logR)步
ret=1
返回(ret-1)
打印(maxXOR(int(input()),int(input()))
你能解释一下这个解决方案背后的直觉吗
谢谢。有一种简单的方法可以解决
O(1)
中的问题
让我们开始:
- 对
和L
执行按位异或运算,并将其存储在变量中,例如R
xored
- 然后将设置的
中的xored
作为MSB
,这就是答案1
L = 10111 --> (23)
R = 11100 --> (28)
_X___ <-- that's most significant differing bit
01111 <-- here's our final answer i.e. (15).
注意:您可以参考
C
和C++
中的解决方案,将问题陈述直接包含在问题中。否则,当链接稍后断开时,没有人会知道这个问题是关于什么的。这里有一个提示-如果L和R有一个共同的前缀,那么L和R之间的每个数字也有相同的前缀,并且这两个数字的每一个可能的XOR都会将该前缀置零。前缀后面的其他位采用不同的值,并且这些位的XOR的最大值将在两个值互为补充时出现,这将给出所有值的XOR结果。因此,对于某些N,每一个可能的最终结果都是形式2^N-1。我想说,这实际上是一个非常巧妙的解决方案,尽管有点不明显-P