解压报文 Python

  • 为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。
  • 压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。
  • 输入压缩后的报文:
  • 1)不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的;
  • 2)原始报文不包含数字,所有的数字只表示重复的次数 n,例如不会出现像 5b 或 3[8] 的输入;
  • 输出描述:
  • 解压后的原始报文
  • 示例1 输入 3[k]2[mn] 输出 kkkmnmn
  • 说明 k 重复3次,mn 重复2次,最终得到 kkkmnmn
  • 示例2 输入 3[m2[c]] 输出 mccmccmcc
  • 说明
  • m2[c] 解压缩后为 mcc,重复三次为 mccmccmcc”
  • 为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。

    压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。

    输入压缩后的报文:

    1)不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的;

    2)原始报文不包含数字,所有的数字只表示重复的次数 n,例如不会出现像 5b 或 3[8] 的输入;

    输出描述:

    解压后的原始报文

    示例1 输入 3[k]2[mn] 输出 kkkmnmn

    说明 k 重复3次,mn 重复2次,最终得到 kkkmnmn

    示例2 输入 3[m2[c]] 输出 mccmccmcc

    说明

    m2[c] 解压缩后为 mcc,重复三次为 mccmccmcc”

    def DecodeStr(encode_str: str):
        stack = []
        rep_num = []
        rep_text = []
        for c in encode_str:
            if c == "]":
                # "]"不能入栈
                # 可以确定的是,第一个"]"的左边字符,肯定是字母,处理字母
                rep_text = []
                while len(stack) > 0 and stack[-1] != "[":
                    rep_text.append(stack.pop())
                rep_text = rep_text[::-1]
                # 该弹出"["的时候,开始处理数字
                if len(stack) > 0 and stack[-1] == "[":
                    stack.pop()
                    while len(stack) > 0 and "0" <= stack[-1] <= "9":
                        rep_num.append(stack.pop())
                    rep_num = rep_num[::-1]
                    rep_num = int("".join(rep_num))
                    # 解码最内层
                    stack.extend(rep_text * rep_num)
                    # 清零重复数,准备解码下一层
                    rep_num = []
            else:
                stack.append(c)
        return "".join(stack)
    
    
    assert (
        DecodeStr("3[m10[cd]]")
        == "mcdcdcdcdcdcdcdcdcdcdmcdcdcdcdcdcdcdcdcdcdmcdcdcdcdcdcdcdcdcdcd"
    )
    
    assert DecodeStr("3[m2[c]]") == "mccmccmcc"
    
    assert DecodeStr("10[k]12[mn]") == "kkkkkkkkkkmnmnmnmnmnmnmnmnmnmnmnmn"
    
    

    #华为OD##括号匹配#
    全部评论

    相关推荐

    10-11 17:45
    门头沟学院 Java
    走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
    点赞 评论 收藏
    分享
    点赞 收藏 评论
    分享
    牛客网
    牛客企业服务