华为OD题目: 简单的解压缩算法

2023-11-15

华为OD题目: 简单的解压缩算法

知识点栈
时间限制: 1s 空间限制: 256MB 限定语言: 不限
题目描述:
现需要实现一种算法,能将一组压缩字符串还原成原始字符串,还原规则如下:1、字符后面加数字N,表示重复字符N次。例如: 压缩内容为A3,表示原始字符串为AAA。2、花括号中的字符串加数字N,表示花括号中的字符串重复N次。例如: 压缩内容为(AB3,表示原始字符串为ABABAB
3、字符加N和花括号后面加N,支持任意的嵌套,包括互相嵌套。例如: 压缩内容可以{A3B1{C}3}3.

输入描述:
输入一行压缩后的宁符串
输出描述
输出压缩前的宁符串
补充说明:
输入保证,数字不会为0,花括号中的内容不会为空,保证输入的都是合法有效的压缩字符串
输入输出字符串区分大小写
输入的字符串长度为范围[1,10000]
输出的字符串长度为范围[1,100000]
数字N范围[1,10000]

示例1
输入:
A3
输出:
AAA
说明:
A3代表A字符重复3次
示例2
输入:
{A3B1{C}3}3
输出:
AAABCCCAAABCCCAAABCCC
说明:
(A3B1C313代表A字符重复3次,B字符重复1次,花括号中的C字符重复3次,最外层花括号中的AAABCCC重复3次

解题思路:

  • 使用栈来处理,本题就是逻辑麻烦一些
  • 遍历字符数组,如果当前字符是非数字,那么入栈,
  • 否则,就向后先把数字获取出来,然后分情况将栈里的字符取出来后,倒序成字符串,再按照数字的倍数拼接
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

/**
 * 简单的解压缩算法
 * 解题思路:
 * 使用栈来处理,本题就是逻辑麻烦一些
 * 遍历字符数组,如果当前字符是非数字,那么入栈,
 * 否则,就向后先把数字获取出来,然后分情况将栈里的字符取出来后,倒序成字符串,再按照数字的倍数拼接
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        char[] chars = line.toCharArray();
        int len = chars.length;
        Deque<Character> stack = new ArrayDeque<>(len);

        int i = 0;
        while (i <= len - 1) {
            char currChar = chars[i];
            //如果不是数字,则入栈
            if (!Character.isDigit(currChar)) {
                stack.push(currChar);
                i++;
                continue;
            }

            //如果是数字
            if (Character.isDigit(currChar)) {
                String str = "";
                //先获取数字前面的字符串
                if (chars[i - 1] == '}') {
                    //取括号里的字符串
                    str = getStrWithMark(stack);
                }else {
                    str = getOnlyLetterStr(stack);
                }
                StringBuilder sbNum = new StringBuilder();
                while (i < len && Character.isDigit(chars[i])) {
                    sbNum.append(chars[i]);
                    i++;
                }
                int n = Integer.parseInt(sbNum.toString());
                //将前面的字符串,n倍拼接
                String s = getNumTimes(str, n);
                //放入栈里面
                for (int j = 0; j < s.length(); j++) {
                    stack.push(s.charAt(j));
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        while (!stack.isEmpty()) {
            sb.append(stack.pop());
        }
        String string = sb.reverse().toString();
        System.out.println(string);


    }

    //获取数字前面括号里面的内容
    public static String getStrWithMark(Deque<Character> stack) {
        StringBuilder sb = new StringBuilder();
        if (stack.peek() == '}') {
            stack.pop();
        }
        while (stack.peek() != '{') {
            char c = stack.pop();
            sb.append(c);
        }
        if (stack.peek() == '{') {
            stack.pop();
        }
        String s = sb.reverse().toString();
        return s;
    }

    //获取数字前面的字符串
    public static String getOnlyLetterStr(Deque<Character> stack) {
        StringBuilder sb = new StringBuilder();
        while (!stack.isEmpty() && stack.peek() != '{') {
            char c = stack.pop();
            sb.append(c);
        }
        String s = sb.reverse().toString();
        return s;
    }

    public static String getNumTimes(String s, int n) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            sb.append(s);
        }
        return sb.toString();
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为OD题目: 简单的解压缩算法 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 使用布尔值进行冒泡排序以确定数组是否已排序

    我有以下用于冒泡排序的代码 但它根本不排序 如果我删除布尔值那么它工作正常 我知道 由于我的 a 0 小于所有其他元素 因此没有执行交换 任何人都可以帮助我解决这个问题 package com sample public class Bub
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • 什么是docker?docker有什么优缺点?

    Docker的思想来自于集装箱 集装箱解决了什么问题 在一艘大船上 可以把货物规整的摆放起来 并且各种各样的货物被集装箱标准化了 集装箱和集装箱之间不会互相影响 那么我就不需要专门运送水果的船和专门运送化学品的船了 只要这些货物在集装箱里封
  • UE4 C++ 编辑器模式下属性被修改时触发对应事件

    pragma once include CoreMinimal h include GameFramework Actor h include TestActors generated h UCLASS class TESTACTOR AP
  • 【Python】发布一个简单好用的日志记录器bestlog

    需求 日志是非常重要的一个东西 我们往往习惯于在开发一个新项目的第一行代码时 就用 logging info 代替 print 随时保持记录的好习惯 等代码上线以后也无需修改替换那些 print 直接开跑 有了完善的日志 才便于分析生产环境
  • 微信月活9亿的高效运维之路

    微信业务量增长的时候 其实我们比较关心的是效率 前期可能两三个月就涨了1倍的量 我们怎么能够保证我们的运营效率是跟得上的 后期可能主要是关心成本 我们在2014年以后增长有点放缓 所以主要的精力会在成本这个方面 分为四块来说 运营规范 云化
  • 团队项目负责人的一些感悟

    我们项目随着项目的越来越来 各种问题越来越多 比如表字段的问题 java对象的设计问题 下面是我们项目后期遇到的问题 一一罗列下 以后带团队必须注意的问题 java中 1 同一个意思的字段 在不同对象中具有不同的写法 比如说A类中金额的字段
  • Java中的String(1)

    目录 String不可变 一个例子 是字符串常量的情况下 是对象的情况下 常用的方法 String不可变 摘自JDK1 8 API文档 Strings are constant their values cannot be changed
  • springboot:异步调用@Async

    一 概述 springboot是基于spring框架的 在springboot环境下演示 Async注解的使用方式 先看下该注解的定义 复制代码 Target ElementType METHOD ElementType TYPE Rete
  • JFS及JFS2文件系统

    复杂度2 5 机密度2 5 最后更新2021 04 29 JFS和JFS2都是AIX支持的文件系统类型 JFS2是JFS的增强版 目前JFS结构已经开源 可以下载到jfs for linux的源代码 JFS开源网站 JFS JFS2都是日志
  • 单片机stm32使用ESP8266MQTT AT指令发送json字符串

    一 问题描述 基于文章 lt 单片机stm32使用rt thread软件包at device的AT指令 gt 测试发现使用MQTT AT指令发送主题信息时 直接发送字符串正常 发送json字符串时出问题 提示错误 数据格式的区别如下 s 正
  • 转:最详细的JavaScript 教程,入门级都能看懂

    目录 介绍 JavaScript特点 用法 实例1 head中的script函数 实例2 body中的script函数 实例3 外部调用JavaScript 输出 实例1 aler 弹窗输出 实例2 document write 输出 实例
  • TTL电路的拉电流、灌电流、扇出数及扇出数计算

    电流 灌电流 扇入数 扇出数 扇出数在数字电路中是非常常见的名词 下面我们先给出这些概念的定义 然后从原理出发 介绍这些名词的关系及扇出数的计算方法 灌电流 灌电流是数字电路输出端口为低电平时外部负载输入的电流 表征输入电流的能力 拉电流
  • 算力还是服务器?这不是一道选择题

    关注我们牛年牛气冲天 算力 顾名思义就是设备的计算能力 它无影无形 虽然看不见 摸不到 却真实存在 小到智能手机 PC 大到服务器 超级计算机 算力就 藏 存各种各样的硬件设备中 像沉睡的金矿 等待你去挖掘 算力 说了算 在云计算时代 一切
  • [荐]硕博经验——科研论文阅读与写作实战技巧

    又转自西电好网 http bbs xdnice com b99t378538 htm硕博经验 转来的 早知道就好了 少走很多弯路啊 该文从 举止优雅的猪 那里看见的 感觉很不错 不过我感觉到了博士才知道这些似乎有点晚了 或者是有不少人也不会
  • 21.openssl编程——EVP

    21 1 EVP 简介 Openssl EVP high level cryptographic functions 提供丰富的密码学中的各种函数 EVP主要封装如下功能函数 a 实现了base64编解码BIO b 实现了加解密BIO c
  • Android Studio 界面显示不全问题

    最近想试试google的android studio开发工具 安装完成后 按照向导新建一个工程 发现向导界面太大 整个屏幕显示不过来 调整界面大小也无法搞定 我用的是ubuntu系统 笔记本分辨率为1366 768 上网百度了好多 发现不少
  • redis集群设置密码

    注意事项 1 如果是使用redis trib rb工具构建集群 集群构建完成前不要配置密码 集群构建完毕再通过config set config rewrite命令逐个机器设置密码 2 如果对集群设置密码 那么requirepass和mas
  • Prometheus 安装及应用(内容较全面)

    prometheus 安装及应用 prometheus 官网 grafana dashboards 模板 prometheus 参考示例 Prometheus普罗米修斯 希腊神话人物 是一个开源的系统监控和告警系统 在kubernetes容
  • 较完整的koa2项目结构实例、脚手架-mysql,gulp

    koa2 starter A koa2 starter by using mysql gulp includes async await pm2 express style middlewares Based on 17koa koa2 d
  • 什么是LDO的线性调整率和负载调整率?

    原文来自公众号 工程师看海 后台回复 LDO仿真文件 LDO是常见的电源架构 线性调整率和负载调整率是两个重要的参数 线性调整率 line regulation 指的是 在特定负载电流条件下 当出入电压变化时 引起的对应输出电压的变化量 从
  • 华为OD题目: 简单的解压缩算法

    华为OD题目 简单的解压缩算法 知识点栈 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现需要实现一种算法 能将一组压缩字符串还原成原始字符串 还原规则如下 1 字符后面加数字N 表示重复字符N次 例如 压缩内容为A3 表