【发布时间】:2016-06-12 20:19:04
【问题描述】:
我正在使用 Python 语言来解决有关 HackerRank 的教程,可在此处获得:https://www.hackerrank.com/challenges/30-bitwise-and
挑战的要点是找到a & b 的最大值,其中a, b ∈ s,s 是定义的集合,例如:s = {1, 2, ... n} 其中a < b。另一个条件是a & b < k where 2 <= k <= n。
给定的输入是n 和k。
我设法拥有O(n^2) 和O(n) 解决方案,但我正在努力想出O(1) 解决方案。
例如,下面是一个虚拟的O(n^2) 解决方案:
def max_and(n, k):
if (n < k) or (k < 2):
raise ValueError()
else:
res = (0, 1, 0)
for a in range(n + 1):
for b in range(n + 1):
if a < b:
temp = a & b
if res[2] < temp < k:
res = (a, b, temp)
return res
for n in range(2, 10):
print(["(n = {}, k = {}) = ".format(n, k) + str(max_and(n, k)) for k in range(2, n + 1)])
我注意到答案总是k - 1 或k - 2,这对我来说很有意义。
我认为这个想法是 a & b 的最大值被限制为小于 k 并且因为逻辑和运算符不能输出大于 b 的数字。
HackerRank 上的一些人想出了一个 O(1) 的解决方案,但我真的不明白它是如何工作的:
a = k - 1
b = (~a) & -(~a)
if (a | b) > n:
print (a - 1)
else:
print (a)
尤其是为什么b = (~a) & -(~a)
我的意思是我明白它可以更改为
【问题讨论】:
-
也对答案感到好奇。如果 a 是整数,b 的结果不总是 k 吗?
-
我也对答案感兴趣,但你也可以将其标记为布尔逻辑
-
@SeekAddo 固定 =]
标签: python algorithm bit-manipulation bitwise-operators boolean-logic