【LeetCode】两道栈相关的题目-394字符串解码,剑指Offer 09两个栈实现队列

本文主要是介绍【LeetCode】两道栈相关的题目-394字符串解码,剑指Offer 09两个栈实现队列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 第394题:字符串解码
  • 剑指Offer 09题:两个栈实现队列

第394题:字符串解码

题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = “3[a]2[bc]”
输出:“aaabcbc”

示例 2:

输入:s = “3[a2[c]]”
输出:“accaccacc”

思路:(1)用一个栈来进行控制,每次遇到数字时将其转化为相应的字符串(思考可能遇到连续的两个或三个数字的情况),遇到 ’ [ ’ 或字母的时候直接入栈,遇到 ’ ] '进行弹栈操作;(2)弹栈时,将弹出的字母放入另一个栈中,因为弹栈的顺序不对,弹完后进行栈的翻转操作,继续将 ’ [ '弹出栈,然后弹出数字,并用数字控制字符串的数目。

几个常规操作:

  • 判断是否是数字 Character.isDigit(cur);
  • 判断是否是字母 Character.isLetter(cur);
  • 进栈操作 stack.addLast(digits); (栈选用的是LinkedList)
  • 弹栈 stack.removeLast();
  • 栈反转 Collections.reverse(sub);
  • 获取栈顶元素 stk.peekLast();
  • 字符串解析成数字 int rep = Integer.parseInt(stk.removeLast);

代码:

class Solution {//ptr为当前指针指向的字符串元素位置int ptr;public String decodeString(String s) {ptr = 0;//构造栈LinkedList<String> stack = new LinkedList<>();while(ptr < s.length()){char cur = s.charAt(ptr);//如果是数字,则构造数字的字符串if(Character.isDigit(cur)){String str = getDigit(s);stack.addLast(str);}else if(Character.isLetter(cur) || cur == '['){stack.addLast(String.valueOf(s.charAt(ptr++)));}//碰到了右括号else{++ptr;LinkedList<String> sub = new LinkedList<String>();while(!"[".equals(stack.peekLast())){sub.addLast(stack.removeLast());}//左括号弹栈stack.removeLast();int rep = Integer.parseInt(stack.removeLast());Collections.reverse(sub);String o = getString(sub);StringBuilder sb = new StringBuilder();while(rep>0){sb.append(o);rep--;}stack.addLast(sb.toString());}}return getString(stack);}/*** 将数字转化为字符串*/public String getDigit(String s){StringBuilder sb = new StringBuilder();while(Character.isDigit(s.charAt(ptr))){sb.append(s.charAt(ptr++));}return sb.toString();}/*** 将栈中的元素拼接为一个字符串*/public String getString(LinkedList<String> v){StringBuilder sb = new StringBuilder();for(String s : v){sb.append(s);}return sb.toString();}
}

剑指Offer 09题:两个栈实现队列

题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例 1:

输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:

示例2:

输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

思路:两个栈S1和S2,S1用来进行入栈操作,S2为辅助栈,当需要出栈时,判断S2是否为空,若S2非空,则将S2中的一个元素弹栈,若S2为空,则继续判断S1是否为空,若S1非空,则将S1中的全部元素压入S2中,否则不能进行弹栈操作。将S1全部压入S2中,能够保证先进先出。

class CQueue {Deque<Integer> stack1;Deque<Integer> stack2;public CQueue() {stack1 = new LinkedList<>();stack2 = new LinkedList<>();}public void appendTail(int value) {stack1.push(value);}public int deleteHead() {if(stack2.isEmpty()){if(stack1.isEmpty()){return -1;}else{while(!stack1.isEmpty()){int temp = stack1.pop();stack2.push(temp);}return stack2.pop();}}else{return stack2.pop();}}
}

这篇关于【LeetCode】两道栈相关的题目-394字符串解码,剑指Offer 09两个栈实现队列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414224

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S