[英]Is there any problem with my code here? I am having trouble with the result
這是我的代碼:我想將字符串從“3[b2[ca]]”解碼為“bcacabcacabcaca”。 但我的結果是“[[[”。 有人可以幫我嗎?
def decompression(text):
intStack = []
charStack = []
temp = ""
result = ""
for i in range(len(text)):
if text[i].isdigit():
times = 0
while text[i].isdigit():
times = times * 10 + int(text[i])
i += 1
i -= 1
intStack.append(times)
elif text[i] == ']':
temp = ""
times = 0
if len(intStack) > 0:
times = intStack[-1]
intStack.pop()
while len(charStack) > 0 and charStack[-1] != '[':
temp += charStack[-1]
charStack.pop()
if len(charStack) > 0 and charStack[-1] == '[':
charStack.pop()
for j in range(times):
result += temp
for j in range(len(result)):
charStack.append(result[j])
result = ""
elif text[i] == '[':
if text[i-1].isdigit():
charStack.append(text[i])
else:
charStack.append(text[i])
intStack.append(1)
else:
charStack.append(text[1])
while len(charStack) != 0:
result += charStack[-1]
charStack.pop()
return result
print(decompression("3[b2[ca]]"))
我一直都有錯誤的答案,我已經檢查了幾次並使用其他在線編輯器進行了測試,但是這段代碼有什么問題? 我還是想不通。
最后一個 else 語句中有一個小錯誤。 它說
else:
charStack.append(text[1])
這應該是
else:
charStack.append(text[i])
此外,您應該縮進函數中的所有內容,否則 python 將不知道它是函數的一部分。
def decompression(text):
intStack = []
charStack = []
temp = ""
result = ""
for i in range(len(text)):
if text[i].isdigit():
times = 0
while text[i].isdigit():
times = times * 10 + int(text[i])
i += 1
i -= 1
intStack.append(times)
elif text[i] == ']':
temp = ""
times = 0
if len(intStack) > 0:
times = intStack[-1]
intStack.pop()
while len(charStack) > 0 and charStack[-1] != '[':
temp += charStack[-1]
charStack.pop()
if len(charStack) > 0 and charStack[-1] == '[':
charStack.pop()
for j in range(times):
result += temp
for j in range(len(result)):
charStack.append(result[j])
result = ""
elif text[i] == '[':
if text[i-1].isdigit():
charStack.append(text[i])
else:
charStack.append(text[i])
intStack.append(1)
else:
charStack.append(text[i])
while len(charStack) != 0:
result += charStack[-1]
charStack.pop()
return result
除了上面提到的答案和評論之外,如果整數不是個位數,那么您查找 intStack 的邏輯將不起作用,我的意思是在您的示例輸入 3[b2[ca]] 中,intStack 將是 [3,2] 那很好但是如果輸入是 33[b22[c6[a]]],那么 intStack 應該是 [33,22,6] 但在這種情況下你的邏輯失敗了。
試試這個來查找 intStack:
intStack = [];
index=[];
for i in range(len(text)):
if i not in index:
if text[i].isdigit():
times="";
while text[i].isdigit():
times+=text[i]
index.append(i);
i+=1
intStack.append(int(times))
雖然這不是最佳實踐,但它有效:
text = "3[b2[ca]]"
list = list(text)
try:
for i in range(len(list)*2):
if list[i] == '[':
list[i] = '*('
if list[i] == ']':
list[i] = ')'
if list[i].isalpha() and list[i+1].isdigit():
list.insert(i+1,"+")
if list[i].isalpha() and list[i+1].isalpha():
list.insert(i+1,"+")
if list[i].isalpha():
globals()[list[i]] = str(list[i])
except:
pass
print(list)
result = ''.join(list)
print(result)
print(eval(result))
基本上,它的作用是:
try: except: pass
這樣我們就可以忽略IndexError: list index out of range
錯誤;[...]
被替換為*(...)
,它找到一個字母后跟一個數字,它添加+
符號,以及它發現彼此相鄰的字母的地方;globals()
內置函數( https://docs.python.org/3/library/functions.html#globals )我們從列表中取出每個字母並將其聲明為一個變量,該變量將自身的字符串表示為一個值;eval()
https://docs.python.org/3/library/functions.html#eval ,我們得到結果:>>> print(text)
3[b2[ca]]
>>> print(list)
['3', '*(', 'b', '+', '2', '*(', 'c', '+', 'a', ')', ')']
>>> result = ''.join(list)
>>> print(result)
3*(b+2*(c+a))
>>> print(eval(result))
bcacabcacabcaca
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.