代码随想录:栈与队列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
            //如果是右括号,如果左右括号不匹配,返回false
            else if(stack.isEmpty() || c != stack.peek()){
                return false;
            }
            //左右括号匹配,栈顶元素出栈
            else{
                stack.pop();
            }
        }
        //如果结束后栈非空,说明左括号多了,也要return false
        return 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要大写。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是容器安全,该怎么进行容器安全的检测防护

随着容器技术的迅速发展和普及&#xff0c;越来越多的企业开始采用容器化解决方案来优化应用部署、提高资源利用率和降低成本。然而&#xff0c;在对大规模部署和使用容器应用来提升业务系统开发速度的时候&#xff0c;大量的数据对象、多种安全风险都需要检测&#xff0c;容器…

Spark_SparkSql写入Oracle_Undefined function.....将长字符串写入Oracle中方法..

在使用Spark编写代码将读库处理然后写入Oracle中遇到了诸多小bug,很磨人。shit!! 实测1&#xff1a;TO_CLOB(a3) 代码样例 --这是一个sparksql写入hive的一个小逻辑&#xff0c;我脱敏了噻 SELECT a1, a2, TO_CLOB(a3) AS clob_data, TO_DATE(a4) AS time FROM table1 WHERE…

外包干了15天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

海外软文通稿代发 - 大舍传媒

引言 在当今高度信息化的时代&#xff0c;企业和个人品牌形象的塑造与传播变得越来越重要。为了在国际舞台上获得更大的竞争优势&#xff0c;许多企业和品牌纷纷将视线投向了国外市场。而在这个过程中&#xff0c;专业的软文通稿代发服务成为了他们的得力助手。本文将向您介绍…

恒创科技:香港服务器CPU核心数如何选?越多越好吗?

​  谈到 CPU“核心”是完成所有处理的组件&#xff0c;程序能否顺利运行的第一因素是你有多少个核心。但由于不同的计算任务占用不同的资源&#xff0c;所以如果您打算简单地创建小型网站或者其他请求处理数据也不高的业务&#xff0c;那么您的基本型号应该包含 1、2 核已经…

云计算重要概念之:虚拟机、网卡、交换机、路由器、防火墙

一、虚拟机 (Virtual Machine, VM) 1.主流的虚拟化软件&#xff1a; 虚拟化软件通过在单个物理硬件上创建和管理多个虚拟环境&#xff08;虚拟机&#xff09;&#xff0c;实现资源的高效利用、灵活部署、隔离安全以及便捷管理&#xff0c;是构建云计算和现代化数据中心的核心…

【电控笔记4】拉普拉斯-传递函数-pid

数据标幺化 拉普拉斯变换 欧拉公式 常见s变换 s变换性质 pid分析 p控制&#xff0c;存在稳态误差 可以求出p的取值范围p>-1&#xff0c;否则发散 pi消除稳态误差 把kp换成Gs 只用pi控制&#xff0c;不加微分的原因&#xff1a; 微分之后&#xff0c;噪声增大高频噪声频率…

【力扣】104. 二叉树的最大深度、111. 二叉树的最小深度

104. 二叉树的最大深度 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输…

机器学习与自主系统

Darpa人工智能中有两个重要方向&#xff0c;一是机器学习&#xff0c;另一个就是自主系统。但真实博弈环境下&#xff0c;更重要的是人机融合体系… 机器学习是一种人工智能的分支&#xff0c;通过使用统计学和数学模型来让计算机系统学习和改进其性能。它可以让计算机从数据中…

FreeRTOS创建第一个程序

使用freeRTOS创建任务时使用如下函数 函数的参数 创建一个FreeRTOS任务点亮led灯实现led灯500毫秒翻转一次 具体的代码实现 #include "stm32f10x.h" // Device header #include "Delay.h" #include "freeRTOS.h" #include &quo…

【bash】linux使用环境变量拼接字符串错误

有如下脚本init-env.sh #!/bin/bash export HADOOP_HOME/opt/hadoop export HADOOP_CONF$HADOOP_HOME/conf执行结果&#xff1a; source init-env.sh echo $HADOOP_CONF_DIR # 得到结果&#xff1a;conf/hadoop&#xff0c;预期因该是/opt/hadoop/conf原因就是linux下使用了w…

零售EDI:Princess Auto EDI对接

Princess Auto 是一家加拿大零售连锁店&#xff0c;专门从事农场、工业、车库、液压和剩余物品的销售。 Princess Auto 总部位于马尼托巴省温尼伯&#xff0c;截至 2024 年 1 月在 10 个省份拥有并经营 55 家商店以及三个配送中心。各种商品均以其“Powerfist”和“Pro.Point”…

Qt 多窗体

前言 在 Qt编程中经常会遇到要在多个界面之间切换的情况&#xff0c;如从登录界面跳转到主界面&#xff0c;从主界面跳转到设置界面&#xff0c;再返回到主界面。我们将会用一个简单的示例来实现多窗体功能。 登录窗口 创建基类为QMainWindow&#xff0c;类名为LoginWin。再使用…

苹果开发者后台添加udid后,xcode中 Devices 数量没有更新问题

删除 文件夹 /Users/…/Library/MobileDevice/Provisioning Profiles 如何打开&#xff1a;https://zhuanlan.zhihu.com/p/563928113 回到Xcode刷新包名下面的警告验证&#xff08;可能需要翻墙&#xff09; 完毕&#xff01;

网站SEO关键词规划时如何筛选出合适的关键词?

在网站SEO优化过程中&#xff0c;关键词布局是一个至关重要的环节。首先&#xff0c;我们需要确定核心关键词&#xff0c;然后通过各种策略和方法对关键词进行扩展。完成关键词扩展后&#xff0c;接下来的任务就是对这些扩展后的关键词进行筛选。那么&#xff0c;如何进行有效的…

WordPress LayerSlider插件SQL注入漏洞复现(CVE-2024-2879)

0x01 产品简介 WordPress插件LayerSlider是一款可视化网页内容编辑器、图形设计软件和数字视觉效果应用程序,全球活跃安装量超过 1,000,000 次。 0x02 漏洞概述 WordPress LayerSlider插件版本7.9.11 – 7.10.0中,由于对用户提供的参数转义不充分以及缺少wpdb::prepare(),…

AI大模型之ChatGPT科普(深度好文)

目录 训练ChatGPT分几步&#xff1f; 如何炼成ChatGPT&#xff1f; 如何微调ChatGPT? 如何强化ChatGPT? 如何调教ChatGPT? AI思维链是什么&#xff1f; GPT背后的黑科技Transformer是什么&#xff1f; Transformer在计算机视觉上CV最佳作品&#xff1f; ChatGPT是人…

[leetcode]remove-duplicates-from-sorted-list

. - 力扣&#xff08;LeetCode&#xff09; 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&…

LeetCode-热题100:148. 排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a; head [4,2,1,3] 输出&#xff1a; [1,2,3,4] 示例 2&#xff1a; 输入&#xff1a; head [-1,5,3,4,0] 输出&#xff1a; [-1,0,3,4,5] 示例…

2017NOIP普及组真题 4. 跳房子

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1417\ 核心思想 首先、本题中提到 “ 至少 要花多少金币改造机器人&#xff0c;能获得 至少 k分 ”。看到这样的话语&#xff0c;基本可以考虑要使用 二分答案。 那么&#xff0c;本题中…