亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我的代碼有問題嗎?我對結果有疑問

我的代碼有問題嗎?我對結果有疑問

呼如林 2022-05-19 13:53:08
這是我的代碼:我想將字符串從“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 resultprint(decompression("3[b2[ca]]"))我一直有錯誤的答案,我已經檢查了好幾次并使用其他在線編輯器進行了測試,但是這段代碼有什么問題?我還是想不通。
查看完整描述

3 回答

?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

最后一個 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


查看完整回答
反對 回復 2022-05-19
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

雖然這不是最佳做法,但它確實有效:


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))

基本上,它的作用是:


獲取文本并將其轉換為列表;

迭代列表長度的兩倍(我們在循環本身期間對列表進行了一些追加,因此是雙精度值);

整個迭代都在 a 內部,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


查看完整回答
反對 回復 2022-05-19
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

除了上面提到的答案和評論之外,如果整數不是個位數,您查找 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))


查看完整回答
反對 回復 2022-05-19
  • 3 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號