代码随想录:栈与队列4-6

20.有效的括号

题目

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

代码

class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for(int i=0; i < s.length(); i++){char c = s.charAt(i);//如果是左括号,就让对应匹配的右括号进栈if(c == '('){stack.push(')');}else if(c == '{'){stack.push('}');}else if(c == '['){stack.push(']');}//如果是右括号,如果此时栈已经空了,说明右括号多了,返回false//如果是右括号,如果左右括号不匹配,返回falseelse if(stack.isEmpty() || c != stack.peek()){return false;}//左右括号匹配,栈顶元素出栈else{stack.pop();}}//如果结束后栈非空,说明左括号多了,也要return falsereturn stack.isEmpty();}
}

总结

1.思想

        要判断左右括号匹配,优先用栈来解决。

        大致算法是,如果是左括号就让其进栈,如果是右括号就把栈顶元素取出来匹配一下,如果不匹配就返回false,匹配就把栈底元素出栈。不过要把所有不匹配的情况考虑清楚:

(1)第一种:左括号多,那么for循环结束之后的栈是非空的

(2)第二种:右括号多,那么遍历到右括号时栈已经是空了

(3)第三种就:左右括号数量匹配但是内容不匹配。

        还有要想一下,如何做左右括号的匹配,其实就是让左括号进栈的时候,替换为对应的右括号就行。

2.算法流程

        用for循环遍历字符串,如果当前元素是左括号“(、{、[ ”,就分别使用三个if分支语句,让其对应的右括号“)、}、] ”进栈。

        如果当前元素已经不是上面3种左括号,已经是右括号了,要判断2种情况,如果此时的栈已经是空的,就代表右括号太多,要返回false,或者如果此时的左右括号不匹配,也要返回false。如果上面的情况都不满足,说明左右括号是匹配的,把栈顶元素pop出来。

        最后,判断栈是否为空,看看左括号是不是太多了就行。

1047.删除字符串中的所有相邻重复项

题目

        给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:"abbaca"
输出:"ca"

代码

class Solution {public String removeDuplicates(String s) {Stack<Character> stack = new Stack<>();for(int i=0;i < s.length(); i++){char c = s.charAt(i);//如果栈是空的,或者栈不空但是栈顶元素!=当前元素if(stack.isEmpty() || stack.peek() != c){stack.push(c); //当前元素入栈}//如果栈非空,且栈顶元素==当前元素else{stack.pop(); //栈顶元素出栈}}StringBuilder sb = new StringBuilder();//把最终的栈元素从栈顶开始输出while(!stack.isEmpty()){sb.append(stack.pop());}//出栈顺序和我们要的结果相反,要把结果字符串反转一下再转为String类型return sb.reverse().toString();}
}

总结

1.思想

        字符串删除重复元素也是一种变相的括号匹配问题。核心思路如下:

        如果栈是空的或者栈顶元素和当前元素不相同,就把当前元素入栈。

        如果栈顶元素等于当前元素,就把栈顶出栈。最后遍历完String后,栈内剩余的就是我们要的不重复的字符串。

2.算法流程

        for循环遍历字符串,获取当前元素c,如果当前栈是空或者栈顶peek元素不等于c,就把当前元素c入栈push到栈中,如果栈顶peek元素等于c,就把栈顶元素pop出来。for循环结束后,栈中剩余的元素就是我们要的结果集,把他们一个个出栈存到字符串里就行。

3.注意点

        由于最后结果集出栈的时候,出栈的字符顺序和我们要的是相反的,所以当栈不空时,可以循环用StringBuild逐个append出栈元素,最后再返回sb.reverse().toString()就行。

150.逆波兰表达式求值

题目

        给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*' 和 '/' 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

示例 1:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

代码

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for(String s : tokens){//如果是算法符合,就把栈顶的两个元素pop出来,计算后再push回去if(s.equals("+")){int x2 = stack.pop();int x1 = stack.pop();stack.push(x1 + x2);}else if(s.equals("-")){int x2 = stack.pop();int x1 = stack.pop();stack.push(x1 - x2);}else if(s.equals("*")){int x2 = stack.pop();int x1 = stack.pop();stack.push(x1 * x2);}else if(s.equals("/")){int x2 = stack.pop();int x1 = stack.pop();stack.push(x1 / x2);}//如果s不是算术符号,s是数字,就把s转为Integer再push进去else{stack.push(Integer.valueOf(s));}}//最后栈内的元素就是计算结果return stack.pop();}
}

总结

1.思想

        逆波兰表达式就是把数字写前面,计算符号写后面的一种计算式。它的计算方法是,如果遇到计算符号,就把该计算符号的前两个数字用该符号进行计算,直到用完每一个计算符号。因此,我们可以用栈存储数字,遇到计算符号,就把栈顶的两个数字出栈计算,计算完再入栈。

2.算法流程

        遍历String数组,如果当前字符串s是“+”,就把栈顶的两个元素pop出来,用x2和x1存储,计算x1+x2结果,把x1+x2再push进栈。其他的“-”、“*”、“/”原理一样,再写三个else语句就行。

        如果当前字符串s是数字,就把s转为Integer整型后push到栈中。最后栈内的元素就是计算结果。

3.注意点

(1)出栈获取两个x1和x2计算时,第一个出栈元素是x2,第二个出栈元素是x1,计算时x1在前x2在后,不能反过来哦。

(2)这里的tokens是字符串数组,不是字符串,因此遍历时,有下面两种方式:

        ①用String进行增强for,写法是String s : tokens

        ②用普通的for,写法是for(int i=0; i < tokens.length; i++) ,然后String s = tokens[i];

如果是String字符串,而不是字符串数组,才能用下面这种写法:

4.语法点

(1)判断两个字符串是否相同,要用s1.equals(s2)。判断字符char是否相同,才能用==。

(2)把String转为Integer,用Integer i = Integer.valueOf(str),注意O要大写。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/806011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打卡--MySQL8.0 四 (索引及执行计划)

一、索引的创建与使用 1、索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 &#xff08;1&#xff09;从 功能逻辑 上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。 &#xff08;…

【测试开发学习历程】python迭代、可迭代对象、迭代器、生成器

1 迭代Iteration 迭代Iteration&#xff1a;所谓迭代就是重复运行一段代码语句块的能力&#xff0c;就好比在一个容器中进行一层一层遍历数据&#xff0c;在应用过程中for循环最为突出。迭代就是从某个容器对象中逐个地读取元素&#xff0c;直到容器中没有元素为止。迭代迭代&…

【R基础】一组数据计算均值、方差与标准差方法及意义

【R基础】一组数据计算均值、方差与标准差方法及意义 均值、方差与标准差是用来描述数据分布情况 均值&#xff1a;用来衡量一组数据整体情况。 数据离散程度度量标准&#xff1a; 方差&#xff08;均方&#xff0c;s^2&#xff0c;总体参数&#xff0c;离均差平方和&#…

AI大模型原理科普(深度好文)

目录 认识AI大模型家族 AI是什么&#xff1f; 机器学习是什么&#xff1f; 机器学习有哪些分支&#xff1f; 什么是强化学习&#xff1f; 深度学习属于哪一类学习&#xff1f; 生成式AI和深度学习是什么关系&#xff1f; 大语言模型是什么&#xff1f; 所有大语言模型…

【Java】HashMap 源码阅读

HashMap 源码阅读 HashMap 简介 HashMap 主要用来存放键值对&#xff0c;实现了基于哈希表的 Map 接口&#xff0c;非线程安全。 HashMap 可以存放 null 的 key 和 null 值&#xff0c;但 null 作为 key 只能有一个&#xff0c;null 作为 value 可以有多个。 HashMap 有两个…

BFS广度优先搜索

import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入您…

业务逻辑漏洞(靶场) fiddler

目录 fiddler简介&#xff1a; 业务逻辑漏洞&#xff1a; fiddler下载 靶场&#xff1a; 实验一 ​编辑实验二&#xff08;ps 更改实验url会变&#xff0c;fiddler没抓到东西看看代理改没改&#xff09; 实验三 实验四 fiddler简介&#xff1a; 一款网络抓包工具&#…

内部类、泛型、常用API

内部类 内部类是类中的五大成分之一&#xff08;成员变量、方法、构造器、代码块、内部类&#xff09; 如果一个类定义在另一个类的内部&#xff0c;这个类就是内部类。 场景&#xff1a;当一个类的内部&#xff0c;包含了一个完整的事物&#xff0c;且这个事物没有必要单独设…

20240403-算法复习打卡day43||● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II class Solution { public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001, 0);int sum 0;for (int i 0; i < stones.size(); i) sum stones[i];int target sum / 2;for (int i 0; i < stones.siz…

智慧城市中的物联网革命——青创智通

工业物联网解决方案-工业IOT-青创智通 得益于物联网 (IoT)的变革力量&#xff0c;智慧城市的概念正在迅速成为现实。物联网正在从根本上改变城市的运作方式&#xff0c;为城市居民带来更高的效率、可持续性和生活质量。在本文中&#xff0c;我们将探讨物联网在智慧城市中的作用…

49 样式迁移【李沐动手学深度学习v2课程笔记】

1. 样式迁移&#xff08;Style Transfer) 计算机视觉的应用之一&#xff0c;将样式图片中的样式&#xff08;比如油画风格等&#xff09;迁移到内容图片&#xff08;比如实拍的图片&#xff09;上&#xff0c;得到合成图片 可以理解成为一个滤镜&#xff0c;但相对于滤镜来讲…

基于SSM框架JAVA仓库管理系统源代码Mysql数据库(可当毕设,实训项目,设计大赛)

仓库管理系统实现的功能包括店铺管理&#xff0c;员工管理&#xff0c;部门管理&#xff0c;商品管理&#xff0c;权限管理&#xff0c;入库管理&#xff0c;出库管理&#xff0c;盘点管理&#xff0c;统计管理等功能。该项目采用了Mysql数据库&#xff0c;Java语言&#xff0c…

Hibernate多事务同时调用update(T t) ,字段被覆盖问题

前言 今天现网有个订单卡单了&#xff0c;经过排查发现没有任何异常日志&#xff0c;根据日志定位发现本应该更新的一个状态&#xff0c;也sql肯定执行了(使用了Hibernate的ORM框架)&#xff0c;但是数据库里面的状态没有更新。大概逻辑如下 String hql from orderInfo where…

大模型训练:如何解决GPU万卡互联挑战?

如何解决GPU万卡互联的挑战 近日&#xff0c;字节跳动携手北京大学研究团队发布重磅论文&#xff0c;揭示了一项革命性技术&#xff1a;将大型语言模型训练扩展至超10,000块GPU的生产系统。此系统不仅解决了万卡集群训练大模型时的效率和稳定性难题&#xff0c;更标志着人工智能…

用dbms_shared_pool.purge清除执行计划

1.Oracle 11g如何清除share pool中某条SQL的执行计划 以前在Oracle 10g数据库上,如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法&#xff08;总不能alter system flush shared_pool&#xff09;,只能…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索&#xff1a; 2. 通俗易懂的回答

【Gem5】获取构建教程

gem5-tutorial-hpca-2023 1 介绍 1.1 Gem5是什么1.2 Gem5可以用来做什么1.3 获取并构建gem5 gem5-tutorial-hpca-2023 打开网址&#xff1a; github 创建教程代码空空间 “Code” -> “Codespaces” -> “Create Codespace on master” GitHub Codespaces 是一个由…

最坏情况为线性时间的第k大元素

在统计和数据分析中&#xff0c;我们经常会遇到求最大值、最小值、中位数、四分位数、Top K等类似需求&#xff0c;其实它们都属于顺序统计量&#xff0c;本文将对顺序统计量的定义和求解算法进行介绍&#xff0c;重点介绍如何在最差时间复杂度也是线性的情况下求解第k大元素。…

在Debian 12系统上安装Docker

Docker 在 Debian 12 上的安装 安装验证测试更多信息引言 在现代的开发环境中,容器技术发挥着至关重要的作用。Docker 提供了快速、可靠和易于使用的容器化解决方案,使开发人员和 DevOps 专业人士能够以轻松的方式将应用程序从一个环境部署到另一个环境。 Docker 的安装过程在…

实用运维工具(转载)

1、查看进程占用带宽情况-Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载&#xff1a;http://sourceforge.net/projects/nethogs/files/nethogs/0.8/nethogs-0.8.0.tar.gz/download [rootlocalhost ~]#yum -y install libpcap-deve…