竞争编码-掩码位-十进制到二进制

时间:2018-10-07 10:29:22

标签: python python-3.x python-2.7 pypy

我正在尝试解决竞争性编码问题。我设法通过了除一个以外的所有测试用例。我想我错过了某种边缘情况。

问题:

给出一个十进制数字作为输入,将其转换为二进制,然后将数字的二进制形式的指定位置(在输入中给出)的位更改为0。以十进制形式输出结果二进制数字。

这是我的代码:

import math
for _ in range(int(input())):
    n = int(input()) #The given number
    a = list(map(int, input().split())) #Positions at which the bits need to be masked
    b = str(bin(n))[:1:-1]
    for i in a:
        if i<=len(b) and b[i-1]=='1':
            n-=math.pow(2, i-1)
    print(int(n))

如果有人可以告诉我我可能错过的可能的极端情况,那就太好了。我找不到关于此问题的任何讨论,也不允许我看到其他人的解决方案。任何帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:1)

假设您在注释中提到的条件适用于测试数据,那么我找不到您的代码无法正确处理的任何极端情况。但是,这是使用按位运算的算法的更有效版本。不仅速度更快,而且还可以处理位掩码列表中的零(尽管这不成问题)。

for _ in range(int(input())):
    # The given number
    n = int(input())
    # Create the bit mask
    mask = sum(1 << int(u) for u in input().split()) >> 1
    # Invert the bits in n which are also in mask
    n ^= n & mask
    print(n)