我的代码有问题吗?我对结果有疑问

这是我的代码:我想将字符串从“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]]"))

我一直有错误的答案,我已经检查了好几次并使用其他在线编辑器进行了测试,但是这段代码有什么问题?我还是想不通。


呼如林
浏览 145回答 3
3回答

FFIVE

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

慕慕森

虽然这不是最佳做法,但它确实有效: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:    passprint(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

天涯尽头无女友

除了上面提到的答案和评论之外,如果整数不是个位数,您查找 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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python