题目好像叫解码,笔试的第一题。
字符串解压,如((ab)2c4)2abc,(ab)2解压成 abab,c4解压成cccc,括号里面的字符要按照括号外面的数字进行翻倍。
我们可以用一个列表来解决这个问题。把这个字符串的每一个字符存在这个列表中,然后我们逐一检查列表。
遇到每一个右括号,我们就记录右括号后面的数字num和两个括号中间的字符串。
字符串进行复制之后我们还需要把这些字符串插入回去。
遇到数字直接把数字前面的单一字符翻倍就可以了
这样遍历一次我们就已经把所有的字符串都解压完毕了,很简单的一个题,当时太紧张没有A出来。
代码
s = '(((ab)2c4)2abc)3'
stack = [i for i in s]
output =""
i = 0
while i<len(stack):
if stack[i] == ')': #找到右括号开始往前走
tmp = ""
j = i-1
while stack[j]!='(': #往前找到对称的括号 取中间的内容
tmp = stack[j]+tmp
j-=1
tmp = tmp*(int(stack[i+1])-1)
for k in i+1,i,j: #从后往前把符号和数字都扔掉
stack.pop(k)
stack = stack[:j]+[i for i in tmp]+stack[j:]
if stack[i].isdigit(): #如果是数字直接翻倍
st = [i for i in stack[i-1]*(int(stack.pop(i))-1)]
stack = stack[:i]+st+stack[i:]
i+=1
fi = "".join(stack)
fi
比较着急没有写括号后面是两位数的情况= =。就在你找到右括号往右取数字的时候一直找到不是数字的那个值之前就可以了。