Python 竞争编码.掩码位.十进制到二进制

Python 竞争编码.掩码位.十进制到二进制,python,python-3.x,python-2.7,pypy,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())) #

我正试图解决一个有竞争力的编码问题。我设法通过了所有的测试用例,只有一个例外。我猜我错过了一个边缘案件

问题:

给定一个十进制数作为输入,将其转换为二进制,并将输入中指定位置的位(以数字的二进制形式)更改为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))

如果有人能说出我可能错过的可能的边缘案例,那就太好了。我找不到任何关于这个问题的讨论,也不允许我看到其他人的解决方案。感谢您的帮助。谢谢。

假设您在注释中提到的条件适用于测试数据,我找不到任何代码不能正确处理的极端情况。但这里有一个更有效的算法版本,使用逐位运算。它不仅速度更快,还可以处理位掩码列表中为零的情况,尽管这不应该是一个问题

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)

我确实考虑到了掩模位置高于位数。仍然无法通过测试用例:我刚刚使用位操作编写了一些测试代码,您的代码在我的所有测试中都正常工作。所以我猜角落案例涉及负数,或者a列表中的零。我忘了提到约束条件了!1.≤ T≤ 104, 1 ≤ N≤ 2^32-1, 1 ≤ 西泽亚≤ 32, 1 ≤ 艾岛≤ 32,位置Ai在数组A中只出现一次。因此不需要处理负整数。因为他们给了1≤ 艾岛≤ 32,我假设不会有一个没有更改的测试用例,这对吗≤ 西泽亚≤ 32表示一个元素始终至少有一个元素。和1≤ 艾岛≤ 32意味着您不必担心一个包含零的函数。所以在这一点上,我不知道该建议什么。