问题描述
我在解码时遇到问题。
首先,字符串 '44444'
被编码为 '54'
。 (5 次 4)
现在当我想解码 '54'
它是空的。
(它确实可以与字母一起使用)
算法将字符串 '4a3b2c'
解码为 'aaaabbbcc'
。
现在,当我想解码 '4a54'
时,它只给出 'aaaa'
,但正确的解码是 'aaaa44444'
。我该如何解码?
代码如下:
def decode_RLE(x):
decode = ''
count = ''
for i in x:
if i.isdigit():
#append to count
count += i
else i:
decode += i * int(count)
count = ''
return decode
解决方法
你可以试试string multiplication:
def decode(string):
output = ''
for i in range(0,len(string),2):
output += int(string[i]) * string[i + 1]
return output
print(decode("54"))
print(decode("4a54"))
输出:
44444
aaaa44444
您甚至可以使用列表推导式:
def decode(s):
return ''.join(int(s[i]) * s[i + 1] for i in range(0,len(s),2))
,
这是由于第一个 if 条件。在循环之后,您会得到 count = "54" 和 decode = ""。然后,该函数返回一个空字符串。
如果输入只有两位数字,技术上不需要循环。试试这个代码:
def decode_RLE(x):
return int(x[0])*x[1]
如果输入的数字超过两位,循环和老式的切片应该可以工作:
def decode_RLE(x):
counts = x[0:len(x):2] #get odd digits
chars = x[1:len(x):2] #get even digits
decode = ""
i = 0
for ch in chars:
decode += int(counts[i])*chars[i]
i += 1
return decode
,
根据您的逻辑,您只需要一位数的长度。如果是这样,您可以像这样迭代:
def decode_rle(x):
decoded = ''
iter_x = iter(x)
for n,c in zip(iter_x,iter_x):
decoded += c * int(n)
return decoded
但这不适用于两位或更多位数的长度
,一个标志可以解决这个问题,告诉算法最后传递的字符是一个数字。
def decode_RLE(x):
decode = ''
count = ''
was_digit = False
for i in x:
if was_digit:
decode += i * int (count)
count = ''
was_digit = False
if i.isdigit():
count += i
was_digit = True
return decode