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

相关文章

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

使用Python和Tkinter实现html标签去除工具

《使用Python和Tkinter实现html标签去除工具》本文介绍用Python和Tkinter开发的HTML标签去除工具,支持去除HTML标签、转义实体并输出纯文本,提供图形界面操作及复制功能,需... 目录html 标签去除工具功能介绍创作过程1. 技术选型2. 核心实现逻辑3. 用户体验增强如何运行

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep