华为OD机试真题 Java 实现【简单的解压缩算法】【2023Q1 200分】,附详细解题思路

news/2024/11/29 4:37:36/

一、题目描述

现需要实现一种算法,能将一组压缩字符串还原成原始字符串,还原规则如下:

1、字符后面加数字N,表示重复字符N次。例如:压缩内容为A3,表示原始字符串为AAA。
2、花括号中的字符串加数字N,表示花括号中的字符串重复N次。例如:压缩内容为{AB}3,表示原始字符串为ABABAB。
3、字符加N和花括号后面加N,支持任意的嵌套,包括互相嵌套。例如:压缩内容可以{A3B1{C}3}3。

二、输入描述

输入一行压缩后的字符串。

三、输出描述

输出压缩前的字符串。

四、补充说明

  1. 输入保证,数字不会为0,花括号中的内容不会为空,保证输入的都是合法有效的压缩字符串;
  2. 输入输出字符串区分大小写;
  3. 输入的字符串长度为范围[1, 10000];
  4. 输出的字符串长度为范围[1, 100000];
  5. 数字N范围[1, 10000]

五、解题思路

  1. 创建一个栈Stack来辅助还原原始字符串;
  2. 使用一个指针i遍历压缩字符串;
  3. 当前字符为左花括号{时,将其入栈;
  4. 当前字符为字母时,将其转换为字符串并压入栈;
  5. 当前字符为数字时,找到连续的数字字符,并将其转换为整数time;
  6. 弹出栈顶元素,重复time次并拼接成字符串add;
  7. 将生成的add入栈;
  8. 当前字符为右花括号}时,依次弹出栈顶元素,直到遇到左花括号{,将弹出的元素拼接成字符串add并入栈;
  9. 将栈内元素依次弹出并拼接,得到最终的原始字符串;

六、Java算法源码

public static void main(String[] args) {Scanner sc = new Scanner(System.in);String line = sc.nextLine();int n = line.length();// 1、创建一个栈Stack<String>来辅助还原原始字符串Stack<String> stack = new Stack<>();// 2、使用一个指针i遍历压缩字符串int i = 0;while (i < n) {char c = line.charAt(i);// 3、当前字符为左花括号{时,将其入栈;if (c == '{') {stack.push(String.valueOf(c));i++;// 4、当前字符为字母时,将其转换为字符串并压入栈;} else if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {stack.push(String.valueOf(c));i++;// 5、当前字符为数字时,找到连续的数字字符,并将其转换为整数time;} else if (c >= '0' && c <= '9') {int j = i;while (j < n && line.charAt(j) >= '0' && line.charAt(j) <= '9') {j++;}int time = Integer.parseInt(line.substring(i, j));String pop = stack.pop();String add = "";// 6、弹出栈顶元素,重复time次并拼接成字符串add;for (int p = 0; p < time; p++) {add += pop;}// 7、将生成的add入栈;stack.push(add);i = j;} else {String add = "";// 8、当前字符为右花括号}时,依次弹出栈顶元素,直到遇到左花括号{,将弹出的元素拼接成字符串add并入栈;while (!stack.isEmpty()) {String pop = stack.pop();if (pop.equals("{")) {break;}add = pop + add;}stack.push(add);i++;}}String ret = "";// 9、将栈内元素依次弹出并拼接,得到最终的原始字符串;while (!stack.isEmpty()) {ret = stack.pop() + ret;}System.out.println(ret);
}

七、效果展示

1、输入

{A3B1{C}3}3

2、输出

AAABCCCAAABCCCAAABCCC

3、说明

{A3B1{C}3}3代表A字符重复3次,B字符重复1次,花括号中的C字符重复3次,最外层花括号中的AAABCCC重复3次。

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【云短信平台优惠活动】【2023Q1 200分】

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

在这里插入图片描述


http://www.ppmy.cn/news/141074.html

相关文章

WPF .Net6中使用Prism

.NET 6 是微软长期支持&#xff0c;并在移动、桌面、IoT 和云应用之间统一了 SDK、基础库和运行时。 Prism为程序设计提供指导,旨在帮助用户更加容易的设计和构建丰富、灵活、易于维护WPF桌面应用程序。Prism使用设计模式&#xff08;如MVVM,复合视图,事件聚合器&#xff09;…

计算机保密口诀,日常工作的保密顺口溜口诀

日常工作的保密顺口溜口诀 相关内容: 顺口溜读起来朗朗上口、韵味十足,从形式上看,顺口溜非常简短,所以便于记忆。第一范文网小编这里为大家整理了一些生活中的顺口溜&#xff0c;希望大家喜欢。 顺口溜是日常生活中人民群众表达自己所见所闻所感常见语言形式,具有朗朗上口、语…

API接口开放平台

近期服务器不想在维护了&#xff0c;接口已经陆续开放 服务器也经常奔溃&#xff0c;一分价钱一分货 忠告&#xff1a;出了事情要学会使用法律武器保护自己 主要推荐初步入门学习的伙伴&#xff0c;可以借助这些接口丰富自己的站点 API接口包括&#xff1a; 一、资讯 全网热…

超级简单的自动刷新_输入名字,自动生成情侣头像~

萌闪光点头像 微信、QQ技巧,各种好玩实用软件分享 大家好 今天给大家介绍 的一个实用的 输入名字, 自动生成情侣头像~ 下面就给大家展示一下吧 视频教程 适合系统:所有 那么也想试试这个输入名字,自动生成情侣头像的话,可以在后台回复【情侣】或者【1314】获取这个软件,…

unicode 生僻字_最难汉字biáng被Unicode收录,网友:我知道该给孩子取什么名了

十三 发自 凹非寺量子位 报道 | 公众号 QbitAI 有一种面条&#xff0c;很多人吃过&#xff0c;但很少人能写对它的名字&#xff0c;甚至拿输入法都打不出来。 没错&#xff0c;这就是著名的陕西 「bing bing 面」。 这是因为像bing这样的字太生僻了&#xff0c;所以电脑的字符编…

springcontext.xml 中方言是红色的_人文黄岩 魅力方言

文&#xff5c;夏吟 黄岩&#xff0c;有着丰厚的文化底蕴。黄岩方言是黄岩历史文化的活化石&#xff0c;她历经漫长的演变过程而逐渐形成&#xff0c;是黄岩历史文化的重要载体和表现形式&#xff0c;具有独特的乡土气息和文化魅力&#xff01; 一、 黄岩方言及其研究概况 黄岩…

送给前线码农的话 – 大牛们的经典语录

近半年来&#xff0c;本人几乎天天逛各大论坛网站&#xff0c;浏览大牛们的博客&#xff0c;摘抄了不少经典的好词好段&#xff0c;虽是只言片语&#xff0c;但是这都是当代大牛们的语录心得&#xff0c;所以今天拿出来与大家分享&#xff0c;希望多留言&#xff0c;共同探讨。…

基于人工智能的盲人阅读器

本文在原码基础上做出很多修改&#xff0c;很感谢博主提供项目开发基础&#xff0c;有读者如果想看原文请点击原文链接&#xff1a;https://blog.csdn.net/aqqwvfbukn/article/details/106349903. 文章目录 引言编写目的背景 一、软件概述&#xff08;一&#xff09;名称&#…