【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

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P