【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

相关文章

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM