【问题标题】:Find the maximum of a & b in a set s = {1, 2, ... n } lesser than a certain value k求集合 s = {1, 2, ... n } 中 a & b 的最大值小于某个值 k
【发布时间】:2016-06-12 20:19:04
【问题描述】:

我正在使用 Python 语言来解决有关 HackerRank 的教程,可在此处获得:https://www.hackerrank.com/challenges/30-bitwise-and

挑战的要点是找到a & b 的最大值,其中a, b ∈ ss 是定义的集合,例如:s = {1, 2, ... n} 其中a < b。另一个条件是a & b < k where 2 <= k <= n

给定的输入是nk

我设法拥有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 - 1k - 2,这对我来说很有意义。

我认为这个想法是 a &amp; b 的最大值被限制为小于 k 并且因为逻辑和运算符不能输出大于 b 的数字。

HackerRank 上的一些人想出了一个 O(1) 的解决方案,但我真的不明白它是如何工作的:

a = k - 1
b = (~a) & -(~a)

if (a | b) > n:
    print (a - 1)
else:
    print (a)

尤其是为什么b = (~a) &amp; -(~a)

我的意思是我明白它可以更改为

【问题讨论】:

  • 也对答案感到好奇。如果 a 是整数,b 的结果不总是 k 吗?
  • 我也对答案感兴趣,但你也可以将其标记为布尔逻辑
  • @SeekAddo 固定 =]

标签: python algorithm bit-manipulation bitwise-operators boolean-logic


【解决方案1】:

j = k - 1,让unset_bit 是两个的最小幂,这样(j &amp; unset_bit) == 0

如果(j | unset_bit) &lt;= n,那么我们选择a = jb = j | unset_bit作为(a &amp; b) == j的最佳值。

如果(j | unset_bit) &gt; n,那么ab 将无法选择(a &amp; b) == j。我们根本没有两个数字可供选择并设置了所有必要的位。由于偶数 j 会给我们 (j | unset_bit) == j+1 &lt;= n,我们必须有 j 奇数。然后选择a = j - 1b = j 给我们(a &amp; b) == j - 1,这是可能的最高值。


您在 HackerRank 上看到的代码实现了这个想法。在您找到的代码中,他们的a 是我们的j,他们的b 是我们的unset_bit,通过一些小技巧计算得出。我使用了junset_bit 而不是ab,因为您已经将这些字母用于其他含义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2011-02-28
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多