leetcode--155.最小栈、224.基本计算器、316.去除重复字母

2024-02-17 02:48

本文主要是介绍leetcode--155.最小栈、224.基本计算器、316.去除重复字母,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

leetcode–155.最小栈

题目:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。

借用一个辅助栈min_stack,用于存获取stack中最小值。

算法流程

  • push()方法: 每当push()新值进来时,如果 小于等于 min_stack栈顶值,则一起push()到min_stack,即更新了栈顶最小值;
  • pop()方法: 判断将pop()出去的元素值是否是min_stack栈顶元素值(即最小值),如果是则将min_stack栈顶元素一起pop(),这样可以保证min_stack栈顶元素始终是stack中的最小值。
  • getMin()方法: 返回min_stack栈顶即可。

min_stack作用分析:

  • min_stack等价于遍历stack所有元素,把升序的数字都删除掉,留下一个从栈底到栈顶降序的栈。
  • 相当于给stack中的降序元素做了标记,每当pop()这些降序元素,min_stack会将相应的栈顶元素pop()出去,保证其栈顶元素始终是stack中的最小元素。

参考

代码:

private Stack<Integer> stack;
private Stack<Integer> minstack;
public MinStack() {stack=new Stack<>();minstack=new Stack<>();
}public void push(int x) {stack.push(x);if(minstack.empty()||x<=minstack.peek()){minstack.push(x);}}public void pop() {if(stack.pop().equals(minstack.peek())){minstack.pop();}
}public int top() {return stack.peek();}public int getMin() {return minstack.peek();
}

leetcode–224.基本计算器

题目:实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -非负整数和空格

leetcode链接

  • 正序迭代字符串。
  • 操作数可以由多个字符组成,字符串 “123” 表示数字 123,它可以被构造为:123 >> 120 + 3 >> 100 + 20 + 3。如果我们读取的字符是一个数字,则我们要将先前形成的操作数乘以 10 并于读取的数字相加,形成操作数。
  • 每当我们遇到 + 或 - 运算符时,我们首先将表达式求值到左边,然后将正负符号保存到下一次求值。
  • 如果字符是左括号 (,我们将迄今为止计算的结果和符号添加到栈上,然后重新开始进行计算,就像计算一个新的表达式一样。如果字符是右括号 ),则首先计算左侧的表达式。则产生的结果就是刚刚结束的子表达式的结果。如果栈顶部有符号,则将此结果与符号相乘。

代码:

public int calculate(String s) {Stack<Integer> stack=new Stack<>();int num=0;int fuhao=1;int sum=0;for(int i=0;i<s.length();i++){char ch=s.charAt(i);if(Character.isDigit(ch)){//10*num:防止输入字符串为‘320223165’num=10*num+(int) ch-'0';}else if(ch=='+'){sum+=fuhao*num;fuhao=1;//每次num要置为0num=0;}else if(ch=='-'){sum+=fuhao*num;fuhao=-1;num=0;}else if(ch=='('){//存入左边结果stack.push(sum);//存入符号stack.push(fuhao);sum=0;fuhao=1;}else if(ch==')'){//得到()中间的结果sum+=num*fuhao;//乘以符号sum*=stack.pop();//加上(左边的结果sum+=stack.pop();num=0;}}//字符串为:‘320223165’,返回num//字符串为加减法时,返回sum+0return sum+(fuhao*num);
}

leetcode–316.去除重复字母

题目:给你一个仅包含小写字母的字符串,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

leetcode链接

代码

用栈来存储最终返回的字符串,并维持字符串的最小字典序。每遇到一个字符,如果这个字符不存在于栈中,就需要将该字符压入栈中。但在压入之前,需要先将之后还会出现,并且字典序比当前字符小的栈顶字符移除,然后再将当前字符压入。

public String removeDuplicateLetters(String s) {Stack<Character> stack=new Stack<>();HashMap<Character,Integer> map=new HashMap<>();for(int i=0;i<s.length();i++){map.put(s.charAt(i),i);}for(int i=0;i<s.length();i++){char ch=s.charAt(i);//栈不能为空,否则后面会出现空指针异常//!stack.contains(ch):栈中不存在ch,才能删除//ch<stack.peek():ch字符序小// map.get(stack.peek())>i:后面还存在stack.peek()//while循环:可能会多次判断:如:bcabcwhile(!stack.empty()&& ch<stack.peek()&& map.get(stack.peek())>i&&!stack.contains(ch)){stack.pop();}if(stack.contains(ch)){stack.push(ch);}}StringBuilder sb=new StringBuilder(stack.size());for (Character c:stack) {sb.append(c.charValue());}return sb.toString();
}

这篇关于leetcode--155.最小栈、224.基本计算器、316.去除重复字母的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java使用Swing生成一个最大公约数计算器

《Java使用Swing生成一个最大公约数计算器》这篇文章主要为大家详细介绍了Java使用Swing生成一个最大公约数计算器的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下... 目录第一步:利用欧几里得算法计算最大公约数欧几里得算法的证明情形 1:b=0情形 2:b>0完成相关代码第二步:加

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进