概述
解压报文 | 时间限制:1秒 | 内存限制:262144K | 语言限制:不限
为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。
压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。
" “输入描述:
输入压缩后的报文:
1)不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的;
2)原始报文不包含数字,所有的数字只表示重复的次数 n ,例如不会出现像 5b 或 3[8] 的输入;
输出描述:
解压后的原始报文
注:
1)原始报文长度不会超过1000,不考虑异常的情况
示例1
输入
3[k]2[mn]
输出
kkkmnmn
说明
k 重复3次,mn 重复2次,最终得到 kkkmnmn
示例2
输入
3[m2[c]]
输出
mccmccmcc
说明
m2[c] 解压缩后为 mcc,重复三次为 mccmccmcc”
- 利用栈的特性。
代码如下:
(方法一,无法覆盖2[3[k]10[mn]],[m2[c2[oi2[jihyb]]]])
def decompression():
string = input().strip()
i,stack,total = 0, [], ""
while i < len(string):
if string[i] == "]":
tmp = ""
while stack:
value = stack.pop()
if value.isalpha():
tmp += value
# elif value.isdecimal(): 其实这个也行,判断是不是小数,只是不严谨。
elif value.isdigit():
tmp = int(value) * tmp[:: -1]
else:
total += tmp
stack.append(string[i])
i += 1
return total
方法二
def decompression(s):
stack = []
length = len(s)
index = length - 1
while index >= 0:
if not s[index].isdigit(): # 非数字入栈
stack.append(s[index])
index -= 1
else: # 遇到数字时,解压
num = ""
res = ""
while index >= 0 and s[index].isdigit():
num = s[index] + num
index -= 1
# 说明此时的index处的字符一定时非数字的,此时栈顶一定是左括号
while stack[-1] != "]": # 获取栈中的字母
tmp = stack.pop()
if tmp != "[": # 只要字母
res += tmp
# 弹出栈顶的元素 # 右括号
stack.pop()
# 解压
res = int(num) * res
stack.append(res)
stack.reverse() # 反转字符串
print("".join([item for item in stack if item not in "[]"]))
# s = "[m2[c2[oi2[jihyb]]]]"
s = "3[m2[c]]"
decompression(s)
最后
以上就是端庄世界为你收集整理的解压报文(python)的全部内容,希望文章能够帮你解决解压报文(python)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复