(新卷,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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Spring Bean?

任何通过Spring 容器实例化、组装和管理的Java对象都能称之为Spring Bean。 Bean可以看成是Spring应用中的一个普通Java对象&#xff0c;这个对象的创建、属性赋值、初始化、销毁等完整的生命周期是由Spring IOC容器来统一管理的&#xff0c;并非程序员手动控制。 Spring Bean的…

短视频直播平台搭建必备:直播美颜SDK与动态贴纸开发/接入详解

在短视频和直播行业的快速发展中&#xff0c;如何让平台更具吸引力、提升用户互动体验成为了开发者和运营者必须关注的核心问题。尤其是对直播平台和短视频平台来说&#xff0c;直播美颜SDK与动态贴纸SDK的引入&#xff0c;已经成为提升用户粘性、增强平台活跃度的重要手段。本…

Suno AI 音乐节奏设计完全指南 | Suno高级篇 | 第23篇

历史文章 Suno AI API接入 - 将AI音乐接入到自己的产品中&#xff0c;支持120并发任务 Suno用邓紫棋的声音唱《我不是真正的快乐》 | 进阶指南 | 第8篇 实测有效&#xff1a;83 个让 Suno 自动写说唱的神级提示 | Suno高级篇 | 第19篇 Suno 电子舞曲创作指南&#xff1a;10…

大模型的微调和预训练区别是什么?

大模型微调&#xff08;Fine-tuning of Large Models&#xff09;是指在预训练&#xff08;Pre-training&#xff09;模型的基础上&#xff0c;使用特定任务的数据对模型进行再训练&#xff0c;使模型适应特定应用场景的需求&#xff0c;本质上就是迁移学习在大模型中的落地方式…

别再做“无效订正“了!这套AI指令把你的错题本变成“提分外挂“

&#x1fa7a; 为什么你总是"精准踩雷"&#xff1f; 你有没有发现一个扎心的现象&#xff1a;那些你曾经错过的题&#xff0c;就像不知疲倦的"丧尸"一样&#xff0c;换个数字、变个场景&#xff0c;你依然会精准地踩进同一个坑里。 明明老师讲过&#xff0…

(新卷,200分)- 不开心的小朋友(Java JS Python)

(新卷,200分)- 不开心的小朋友&#xff08;Java & JS & Python&#xff09; 题目描述 游乐场里增加了一批摇摇车&#xff0c;非常受小朋友欢迎&#xff0c;但是每辆摇摇车同时只能有一个小朋友使用&#xff0c;如果没有空余的摇摇车&#xff0c;需要排队等候&#xf…

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

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

怎么将已有的应用转换成MCP服务?

将已有的应用转换为MCP&#xff08;Model Context Protocol&#xff09;服务需要将该应用的功能封装为标准化的MCP工具、资源或者提示&#xff0c;再通过MCP Server对外暴露。 主要步骤如下&#xff1a; 1.首先需要识别应用中要提供给外部调用的功能&#xff0c;比如说API接口、…

万象EXCEL应用(二十四) KTV 营业报表+员工提成 ——东方仙盟炼气期

KTV营业报表提成报表整合 KTV 每日、每月的核心营收数据&#xff0c;涵盖包厢消费、酒水销售、增值服务等全品类收入&#xff0c;清晰呈现营收总额、时段营收分布、客源结构等关键指标&#xff0c;无需手动统计零散单据&#xff0c;自动生成标准化报表&#xff0c;支持多维度筛…

django毕设项目:基于django+网络爬虫的安客居二手房屋信息采集系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Spring Security 7 之 OIDC /connect/userinfo 端点解析:ID Token 与用户信息获取

前言 在使用 Spring Security OAuth2 Authorization Server 时&#xff0c;很多开发者对 /userinfo 端点存在两个常见的疑问&#xff1a; 如果 ID Token 已经包含了用户信息&#xff0c;为什么还需要单独的 /userinfo 端点&#xff1f;请求 /userinfo 时使用的是 access_toke…

22 分钟拿下 Uber 2026 OA!Python 解题 + 推广福利,大厂笔试稳了

家人们谁懂啊&#xff01;Uber 2026 OA 居然这么多 “送分题”&#xff1f;用 Python 刷题 模板复用&#xff0c;我直接 22 分钟通关 4 道题&#xff0c;70 分钟的考试时间硬生生省出大半&#xff01;今天把保姆级解题思路 推广福利全分享&#xff0c;想冲大厂的宝子速码&…

当AI学会拍短剧:Huobao Drama全栈AI短剧生成平台深度解析

从一个想法到一部完整短剧&#xff0c;AI只需要几分钟。这不是科幻&#xff0c;这是正在发生的技术革命。 前言&#xff1a;一个程序员的"导演梦" 还记得小时候看电视剧&#xff0c;总幻想自己能当导演&#xff0c;拍出惊天动地的大片。长大后才发现&#xff0c;拍一…

【课程设计/毕业设计】大数据基于网络爬虫的安客居二手房屋信息采集系统基于django+网络爬虫的安客居二手房屋信息采集系统的设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

快速看懂供应链的三张表:采购计划表、库存盘点表、供应商评估表

你每天在供应链一线&#xff0c;是不是经常遇到这些事儿&#xff1a;采购计划做了&#xff0c;货却没按时到&#xff0c;生产线等着急了&#xff1b;库存盘点一查&#xff0c;发现一堆呆滞料、账实不符&#xff0c;月底对不上账&#xff1b;供应商换了好几轮&#xff0c;质量还…

先知AI洞察 | 男装创意的枯竭,是否已让您彻夜难眠?

当下男装市场同质化严重&#xff0c;设计灵感仿佛陷入循环&#xff0c;你是否也感受到了这份挥之不去的创意焦虑&#xff1f;从趋势预测到图案设计&#xff0c;传统的创作流程耗时费力&#xff0c;且难以突破固有思维。这不仅是设计师的困境&#xff0c;更是品牌面对快速迭代的…

【毕业设计】基于django+网络爬虫的安客居二手房屋信息采集系统的设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

技术速递|想要更好的 AI 输出?试试上下文工程

作者&#xff1a;Christina Warren 排版&#xff1a;Alan Wang 了解如何通过自定义指令、可复用提示词以及自定义智能体&#xff0c;帮助 GitHub Copilot 提供更精准的结果。 如果你曾觉得 GitHub Copilot 只要多一点上下文就能变得更强大&#xff0c;那你的感觉是对的。上下文…

吐血推荐10个一键生成论文工具,继续教育学生轻松搞定论文写作!

吐血推荐10个一键生成论文工具&#xff0c;继续教育学生轻松搞定论文写作&#xff01; AI 工具助力论文写作&#xff0c;轻松应对学术挑战 在当前的继续教育环境中&#xff0c;论文写作已成为许多学生必须面对的重要任务。无论是本科、硕士还是博士阶段&#xff0c;撰写一篇高质…