news 2026/5/4 16:34:44

(新卷,200分)- 报文解压缩(Java JS Python)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,200分)- 报文解压缩(Java JS Python)

(新卷,200分)- 报文解压缩(Java & JS & Python)

题目描述
  • 为了提升数据传输的效率,会对传输的报文进行压缩处理。
  • 输入一个压缩后的报文,请返回它解压后的原始报文。
  • 压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。
  • 注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。
输入描述

输入压缩后的报文:

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

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

输出描述

解压后的原始报文

注:原始报文长度不会超过1000,不考虑异常的情况

用例
输入3[k]2[mn]
输出kkkmnmn
说明k 重复3次,mn 重复2次,最终得到 kkkmnmn
输入3[m2[c]]
输出mccmccmcc
说明m2[c] 解压缩后为 mcc,重复三次为 mccmccmcc
题目解析

本题可以使用栈结构解题。思路也比较简单明了。

我们只需要统计出如下几个关键信息即可:

  • 要被重复的子串(可以分解记录子串两边的'[',']'的位置)
  • 要被重复的子串的重复次数

定义一个栈stack,然后开始遍历输入字符串str的每一个字符c:

  • 如果 c == '[',则可以统计到两个信息:
  1. 要被重复的子串的起始位置
  2. 根据题目描述,'['的前面必然是重复次数,因此'['可以作为重复次数结束统计的标志
  • 如果 c == ']',则可以得到要被重复的子串的结束位置,此时我们可以进行生成解压串,来替换掉对应范围的压缩串
  • 如果 c 是数字,则必然是重复次数的组成,此时可以记录下来,当遇到’[‘时,可以得到一个重复次数
  • 如果 c 是其他字符,则压入栈中。
JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { console.log(getResult(line)); }); /* 算法逻辑 */ function getResult(str) { const stack = []; // idxs记录要被重复的子串的起始位置 const idxs = []; // nums记录要被重复的子串的重复次数,和idxs对应 const nums = []; // tmpRepeatCount记录正在拼接的重复次数字符串 const tmpRepeatCount = []; // 遍历输入的字符串, c是当前正在遍历的字符 for (let c of str) { if (c == "[") { // 此时tmpRepeatCount已记录完当前重复子串对应的重复次数的所有字符 const repeatCount = Number(tmpRepeatCount.join("")); nums.push(repeatCount); tmpRepeatCount.length = 0; // 记录要被重复的子串的起始位置 idxs.push(stack.length); } else if (c == "]") { // 需要被重复的子串在栈中的起始位置 const start = idxs.pop(); // 需要被重复的次数 const repeatCount = nums.pop(); // 需要被重复的子串 const repeatStr = stack.splice(start).join(""); // 将新串压入栈中 stack.push(new Array(repeatCount).fill(repeatStr).join("")); } else if (c >= "0" && c <= "9") { tmpRepeatCount.push(c); } else { stack.push(c); } } return stack.join(""); }
Java算法源码
import java.util.LinkedList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); System.out.println(getResult(str)); } public static String getResult(String str) { // Java可以使用StringBuilder模拟栈 StringBuilder sb = new StringBuilder(); // idxs记录要被重复的子串的起始位置 LinkedList<Integer> idxs = new LinkedList<>(); // nums记录要被重复的子串的重复次数,和idxs对应 LinkedList<Integer> nums = new LinkedList<>(); // tmpRepeatCount记录重复次数的的字符组成 StringBuilder tmpRepeatCount = new StringBuilder(); // 遍历输入的字符串 for (int i = 0; i < str.length(); i++) { // c是当前正在遍历的字符 char c = str.charAt(i); if (c == '[') { // 此时tmpRepeatCount已记录完当前重复子串对应的重复次数的所有字符 int repeatCount = Integer.parseInt(tmpRepeatCount.toString()); nums.add(repeatCount); tmpRepeatCount = new StringBuilder(); // 记录要被重复的子串的起始位置 idxs.add(sb.length()); } else if (c == ']') { // 需要被重复的子串在栈中的起始位置 int start = idxs.removeLast(); // 需要被重复的次数 int repeatCount = nums.removeLast(); // 需要被重复的子串 String repeatStr = sb.substring(start); // 重复后的新串 StringBuilder tmp = new StringBuilder(); for (int j = 0; j < repeatCount; j++) tmp.append(repeatStr); // 替换对应子串为重复后的新串 sb.replace(start, sb.length(), tmp.toString()); } else if (c >= '0' && c <= '9') { tmpRepeatCount.append(c); } else { sb.append(c); } } return sb.toString(); } }
Python算法源码
# 输入获取 s = input() # 算法入口 def getResult(s): stack = [] # idxs记录要被重复的子串的起始位置 idxs = [] # nums记录要被重复的子串的重复次数,和idxs对应 nums = [] # tmpRepeatCount记录重复次数的的字符组成 tmpRepeatCount = [] # 遍历输入的字符串,c是当前正在遍历的字符 for c in s: if c == '[': # 此时tmpRepeatCount已记录完当前重复子串对应的重复次数的所有字符 repeatCount = int("".join(tmpRepeatCount)) nums.append(repeatCount) tmpRepeatCount = [] # 记录要被重复的子串的起始位置 idxs.append(len(stack)) elif c == ']': # 需要被重复的子串在栈中的起始位置 start = idxs.pop() # 需要被重复的次数 repeatCount = nums.pop() # 需要被重复的子串 repeatStr = "".join(stack[start:]) # 先删除要被替换的子串,然后加入新串(即重复对应次数的子串) stack = stack[:start] stack.append("".join([repeatStr] * repeatCount)) elif '0' <= c <= '9': tmpRepeatCount.append(c) else: stack.append(c) return "".join(stack) # 算法调用 print(getResult(s))
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 15:48:49

河北石家庄/山东济南/天津商场美陈氛围升级设计公司【力荐】

在华北的商业图景中&#xff0c;商场正逐渐成为连接地域文化与当代生活的视觉载体。石家庄的质朴、济南的泉韵、天津的多元——三座城市的空间美学呈现出不同的文化肌理&#xff0c;也共同面对着商业氛围如何与城市气质相融的当代命题。肆墨设计顾问有限公司 肆墨设计是一家从事…

作者头像 李华
网站建设 2026/5/4 16:33:43

强烈安利!本科生必用10款一键生成论文工具测评

强烈安利&#xff01;本科生必用10款一键生成论文工具测评 学术写作工具测评&#xff1a;为什么你需要这份2026榜单 在当前高校学术环境日益复杂的背景下&#xff0c;本科生的论文写作任务不仅数量增加&#xff0c;对质量与规范的要求也不断提升。面对选题困难、文献整理繁琐、…

作者头像 李华
网站建设 2026/5/2 11:24:37

B 树 vs B+ 树:为什么 MySQL 用 B+ 树,而不是 B 树?

&#x1f333; B 树 vs B 树&#xff1a;为什么 MySQL 用 B 树&#xff0c;而不是 B 树&#xff1f;B 树不是 B 树的“升级版”&#xff0c;而是为“范围查询”而生的专用结构。如果你学过数据结构&#xff0c;一定听说过 B 树&#xff08;B-Tree&#xff09;&#xff1b; 如果…

作者头像 李华
网站建设 2026/5/1 17:27:58

BLE 蓝牙开发入门:用手机控制开发板 LED

&#x1f4f1; BLE 蓝牙开发入门&#xff1a;用手机控制开发板 LED学 BLE&#xff0c;不从点灯开始&#xff0c;等于白学。 这一篇&#xff0c;我们用最经典、成功率最高的 BLE Demo&#xff1a; 手机 → 蓝牙 → 单片机 → 控制 LED 帮你真正入门 BLE&#xff0c;而不是只停留…

作者头像 李华
网站建设 2026/4/29 21:17:09

MySQL + MQ 最终一致性终极方案:Outbox + 幂等 + 补偿 + 对账全解析

适用对象:后端架构师 / 高级开发 / 分布式系统设计者 适用场景:订单系统、支付系统、库存系统、账户系统、积分系统、异步解耦系统 MQ 示例:RocketMQ(Kafka、Pulsar 原理一致) 一、问题背景:为什么分布式系统一定会“不一致”? 在微服务架构中,最常见的模式是: 业务服…

作者头像 李华