我试图在Python中找到一个数字的补码。我知道还有其他解决方案,但我正在努力创造自己的解决方案。 我的第一次尝试:
def findComplement(self, num):
"""
:type num: int
:rtype: int
"""
numb = str(num)
i = 0
while(i<=len(numb)):
if numb[i] == "0":
numb[i] = "1"
else:
numb[i] = "0"
i=i+1
return int(numb)
但是字符串是不可变的所以它给出了一个错误, 我的第二次尝试:
def findComplement(self, num):
"""
:type num: int
:rtype: int
"""
numb = str(num)
numb2 = []
k =0
for j in numb:
numb2[k] = j #error on this line
k=k+1
i = 0
while(i<=len(numb2)):
if numb2[i] == "0":
numb2[i] = "1"
else:
numb2[i] = "0"
i=i+1
return int(numb2)
程序2中的错误:
Line 11: IndexError: list assignment index out of range
答案 0 :(得分:0)
numb2
是一个空列表。它没有任何要处理(和更新)的元素。您需要的是bytearray
,而不是list
(或string
):
def findComplement(self, num):
"""
:type num: int
:rtype: int
"""
numb = bytearray(str(num), 'utf-8')
i = 0
while(i<len(numb)):
if numb[i] == ord("0"):
numb[i] = ord("1")
else:
numb[i] = ord("0")
i=i+1
return int(numb)
可以看出,这需要进行一些小的其他更改,因为bytearray
中的存储数据是一个字节(0-255)而不是char。解决方案是使用ord
函数来获取"0"
和"1"
的字节数。此外,while
表达式中存在一个小问题(逐个关闭)。由于索引和您的计数从零开始i
应该严格小于字符串的长度。
我还想补充说,尽管如此,还是有简单的方法可以实现0和/或1的补充。
答案 1 :(得分:0)
你有一些问题。
首先,您没有正确地将输入转换为二进制字符串。这可以通过Error (12) Need Expression
代替numb = bin(num)[2:]
来完成。
其次,您正在尝试索引空num = str(num)
列表。实际上,无需创建单独的numb2
列表,您可以直接在numb2
字符串上操作,就像您第一次尝试一样。例如:
numb
最后,要将二进制字符串转换回int,您应该for i in range(len(numb)):
if numb[i] == "0":
numb[i] = "1"
else:
numb[i] = "0"
而不是int(numb, 2)
。
答案 2 :(得分:0)
难道你不是指〜运算符,例如:
Transaction
答案 3 :(得分:0)
由于其他答案涵盖了您的主要问题,您还可以使用字典将1
映射到0
,反之亦然:
>>> d = {'0': '1', '1': '0'}
>>> s = '0101'
>>> ''.join(d[x] for x in s)
'1010'