您将获得两个32位数字,N和M,以及两个位,即i和j.编写一种方法来将N和j之间的所有位设置为N等于M(例如,M变为位于i的N的子串并从j开始).示例:输入:N = 10000000000,M = 10101,i = 2,j = 6输出:N = 10001010100
这个问题来自Cracking the Coding的采访.我能够使用以下O(j - i)算法解决它:
def set_bits(a, b, i, j):
if not b: return a
while i <= j:
if b & 1 == 1:
last_bit = (b & 1) << i
a |= last_bit
else:
set_bit = ~(1 << i)
a &= set_bit
b >>= 1
i += 1
return a
Run Code Online (Sandbox Code Playgroud)
作者给出了这个O(1)算法作为解决方案:
def update_bits(n, m, i, j):
max = ~0 # All 1s
# 1s through position j, …Run Code Online (Sandbox Code Playgroud)