代码随想录算法训练营第11天| 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

系列文章目录


目录

  • 系列文章目录
  • 20. 有效的括号
    • 利用栈对称匹配
      • 将栈中元素弹出与判断栈顶元素是否匹配分开,比较耗时(2ms):
      • 若将栈中元素弹出与判断栈顶元素是否匹配放一起,比较节省时间(1ms):
  • 1047. 删除字符串中的所有相邻重复项
    • ①使用 `Deque` 作为堆栈
    • ②双指针法(使用快慢指针)比用栈快很多
    • 在这里插入图片描述
  • 150. 逆波兰表达式求值


20. 有效的括号

(1)不匹配的情况分为三类:①多了左括号,②多了右括号,③左右括号不匹配。
(2)每当遇到了左括号,就把对应的右括号(方便后面比较)加入栈内(用栈就可以保证后进去的可以先进行匹配,符合对称逻辑)。如果遇到了右括号,那么就与栈内的元素进行比较。最终出现的情况:遍历完了栈还有元素(多左),还没遍历完栈已经空了(多右),遍历元素与栈顶元素不相等(左右不匹配)。

利用栈对称匹配

开头可以先对字符串长度进行判断,因为如果长度不是偶数,那么一定是不匹配的括号。

import java.util.Stack;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean isValid(String s) {
        if (s.length() % 2 != 0) {// 如果s的长度为奇数,一定不符合要求
            return false;
        }
        Stack<Character> st = new Stack<>();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
            if (ch == '(') {
                st.push(')');
            } else if (s.charAt(i) == '{') {
                st.push('}');
            } else if (s.charAt(i) == '[') {
                st.push(']');
            } else if (st.isEmpty() || st.peek() != ch) {
                //①:遍历字符串匹配的过程中,栈空了,说明多了右括号
                //②遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。即左右括号不匹配
                return false;
            } else {
                st.pop();
            }
        }
        //最后判断栈中元素是否匹配,如果不为空,说明多了左括号
        return st.isEmpty();
    }
}
//leetcode submit region end(Prohibit modification and deletion)

将栈中元素弹出与判断栈顶元素是否匹配分开,比较耗时(2ms):

 else if (st.isEmpty() || /*st.pop()*/st.peek() != ch) {
                //①:遍历字符串匹配的过程中,栈空了,说明多了右括号
                //②遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。即左右括号不匹配
                return false;
            } else {
                st.pop();
            }

若将栈中元素弹出与判断栈顶元素是否匹配放一起,比较节省时间(1ms):

else if (st.isEmpty() || st.pop() != ch) {
                //①:遍历字符串匹配的过程中,栈空了,说明多了右括号
                //②遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。即左右括号不匹配
                return false;
            }

在这里插入图片描述


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

①使用 Deque 作为堆栈

(1)Deque是双端队列,两端都可以进出。Deque堆栈操作方法:push()、pop()、peek()
push():将元素推送到由此deque表示的堆栈(换句话说,在此deque的头部),如果当前没有可用空间,则抛出IllegalStateException异常。
此方法相当于addFirst()
pop():从这个deque表示的堆栈中弹出一个元素。 换句话说,删除并返回此deque的第一个元素。
peek():检索但不删除由此deque表示的队列的头部(换句话说,该deque的第一个元素),如果此deque为空,则返回null
(2)基本数据类型转String类型,只需将基本数据类型的值+“”。
(3)加入栈的条件:deque.isEmpty() || deque.peek() != ch,①栈为空。②当前元素不等于栈顶元素。

import java.util.ArrayDeque;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String removeDuplicates(String s) {
        //ArrayDeque会比LinkedList在除了删除元素这一点外会快一点
        //参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
        ArrayDeque<Character> deque = new ArrayDeque<>();
        char ch;
        for (int i = 0; i < s.length(); i++) {
            ch = s.charAt(i);
            if (deque.isEmpty() || deque.peek() != ch) {
                deque.push(ch);
            } else {
                deque.pop();
            }
        }
        //基本数据类型转String类型,只需将基本数据类型的值+""。
        String str = "";
        while (!deque.isEmpty()) {
            str = deque.pop() + str;//字符串拼接的同时实现反转
        }
        return str;
    }

}
//leetcode submit region end(Prohibit modification and deletion)

在这里插入图片描述

②双指针法(使用快慢指针)比用栈快很多

class Solution {
    public String removeDuplicates(String s) {
        char[] ch = s.toCharArray();
        int fast = 0;
        int slow = 0;
        for (fast = 0; fast < ch.length; fast++) {
        //while(fast <ch.length()){
            // 直接用fast指针所指向的元素的值覆盖slow指针的值
            ch[slow] = ch[fast];

            // 遇到前后相同值的,就跳过,即slow指针后退一步,下次循环就可以直接被覆盖掉了
                //此时为slow-1,即指向第一个重复的元素,在下一次循环中,
                // 由于fast指向两个重复项的后一个元素,就将该元素赋值给第一个重复的元素的位置即slow-1。
            if (slow > 0 && ch[slow] == ch[slow - 1]) {
                slow--;
            } else {
                slow++;
            }
            //fast++;//与while配合使用
        }
        return new String(ch,0,slow);
    }
}

在这里插入图片描述

150. 逆波兰表达式求值


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

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

相关文章

计算机视觉之三维重建(1)---摄像机几何

文章目录 一、针孔模型和透镜1.1 针孔摄像机1.2 近轴折射模型1.3 透镜问题 二、摄像机几何2.1 像平面和像素平面2.2 齐次坐标下的投影变换2.3 摄像机倾斜2.4 规范化摄像机2.5 世界坐标系2.6 Faugeras定理2.7 投影变换性质&#xff1a; 三、其他投影摄像机模型3.1 弱透视投影摄像…

【小白笔记:JetsonNano学习(二)JetsonNano 安装开机问题屏幕进不去】

重新烧录sd卡后插入Jetson Nano后出现的界面显示烧录失败&#xff0c;如下所示&#xff1a; 将经过烧录之后的sd卡插入jetson nano之后出现以下的几个界面&#xff0c;表示烧录失败。 原因分析&#xff1a;烧录的tf卡为sd卡时候的格式化的格式不对&#xff0c;新建格式出错&am…

万界星空科技漆包线工厂生产管理软件

今天就说说漆包线行业&#xff0c;漆包线是工业电机&#xff08;包括电动机和发电机&#xff09;、变压器、电工仪表、电力及电子元器件、电动工具、家用电器、汽车电器等用来绕制电磁线圈的主要材料。 产业结构调整加快&#xff0c;技术升级和需求多样化是推动漆包线加快产业…

c语言基础~函数详解

前言 今天我们来学习一波函数的概念,帮助各位理解函数,本次博客取自一些书籍以及各大网站的讲解,把它整合在一起并且详细讲解 1函数的理解 我们得知道什么是函数&#xff0c;函数的作用是什么,好不会表述没关系&#xff0c;我们翻书 c primer plus 是这么说的"函数是指…

【JAVA】Servlet开发

目录 HttpServlet HttpServletRequest HttpServletResponse 错误页面 设置网页自动刷新时间 构造重定向相应 js发起http请求 服务器端对js发起的http请求进行处理 前端获取后端数据&#xff0c;添加到当前页面的末尾&#xff0c;代码示例&#xff1a; 前后端交互&…

24计算机考研调剂 | 【官方】山东师范大学(22自命题)

山东师范大学2024年拟接收调剂 考研调剂信息 调剂专业目录如下&#xff1a; 计算机技术&#xff08;085404&#xff09;、软件工程&#xff08;085405&#xff09; 补充内容 我校2024年硕士研究生调剂工作将于4月8日教育部“中国研究生招生信息网”&#xff08;https://yz.ch…

如何使用代理IP进行口子查和渠道查:代理IP使用方法

在进行问卷调查时&#xff0c;为了避免被限制访问或被封禁IP&#xff0c;使用代理IP已经成为了必要的选择。 其中&#xff0c;口子查和渠道查也不例外。 使用代理IP可以隐藏本机IP地址&#xff0c;模拟不同的IP地址&#xff0c;从而规避被封禁的风险。但是&#xff0c;对于很…

3.Gen<I>Cam文件配置

Gen<I>Cam踩坑指南 我使用的是大恒usb相机&#xff0c;第一步到其官网下载大恒软件安装包,安装完成后图标如图所示&#xff0c;之后连接相机&#xff0c;打开软件&#xff0c;相机显示一切正常。之后查看软件的安装目录如图&#xff0c;发现有GenICam和GenTL两个文件&am…

2024全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开 定制版红娘交友平台小程序源码&#xff0c;很牛逼的东西&#xff0c;虽然是小程序&#xff0c;但是有700多M大&…

【办公类-22-11】周计划系列(5-3)“周计划-03 周计划内容循环修改“ (2024年调整版本)

背景需求&#xff1a; 前文从原来的“新模版”文件夹里提取了周计划主要内容和教案内容。 【办公类-22-10】周计划系列&#xff08;5-2&#xff09;“周计划-02源文件docx读取5天“ &#xff08;2024年调整版本&#xff09;-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞29次&…

苍穹外卖-day10:Spring Task、订单状态定时处理、来单提醒(WebSocket的应用)、客户催单(WebSocket的应用)

苍穹外卖-day10 课程内容 Spring Task订单状态定时处理WebSocket来单提醒客户催单 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框…

el-form 的表单校验,如何验证某一项或者多项;validateField 的使用

通常对form表单的校验都是整体校验&#xff1a; this.$refs.form.validate( valid > {if (valid) {// 校验通过&#xff0c;业务逻辑代码...} }); 如果需要对表单里的特定一项或几项进行校验&#xff0c;应该如何实现&#xff1f; 业务场景&#xff1a;下图点探测按钮时…

高精度计算

主页&#xff1a;(*∇&#xff40;*) 咦,又好了~ xiaocr_blog &#xff08;1&#xff09;数据的接收方法和存储方法: 当输入的数据很长的时候&#xff0c;可采取字符串方式输入&#xff0c;这样可以输入位数很长的数&#xff0c;利用字符串函数和操作运算&#xff0c;将每一位…

复杂网络——半局部中心法

一、概述 由于最近写论文需要使用复杂网络知识中的半局部中心法&#xff0c;但是截止目前来说&#xff0c;网上几乎搜索不到有关的MATLAB程序代码&#xff0c;只有一篇用Python编写的程序&#xff0c;我的电脑中没有python&#xff0c;所以我花费一些时间&#xff0c;利用matla…

Excel数据可视化

饼图 1、选中数据----点击插入----点击饼图 2、更改数据标签&#xff08;修改标题名直接改就行&#xff09; 柱形图 1、选中数据、点击插入二维柱形图 坐标轴问题----切换行和列 如何将横轴变成想要的4、5、6、7月&#xff1f; &#xff08;1&#xff09;右键----选择数据 -…

计算机二级(Python)真题讲解每日一题:《十字叉》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ ‪‬‪‬‪‬‪‬‪‬‮‬‪…

Java解决完全二叉树的节点个数

Java解决完全二叉树的节点个数 01 题目 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的…

202303 CSP认证 | LDAP

LDAP 好好好&#xff0c;难度直线上升&#xff0c;是一道又有了字符串处理味道的第三题 第一把写官网40分&#xff0c;acwing TLE且只通过了一道数据…本文是自己这题奋斗过程 的一个记录 先贴个40分的代码&#xff1a; #include<bits/stdc.h> using namespace std; t…

计算机网络:性能指标

计算机网络&#xff1a;性能指标 速率带宽吞吐量时延时延带宽积往返时间利用率丢包率 本博客介绍计算机网络的性能指标&#xff0c;我们可以从不同的方面来度量计算机网络的性能。常用的计算机网络性能指标有以下 8 个&#xff0c;他们是&#xff1a;速率、带宽、吞吐量、时延、…

Android弹出通知

发现把Android通知渠道的重要性设置为最高时&#xff0c;当发送通知时&#xff0c;通知能直接弹出来显示&#xff0c;以前一直搞不明白为什么别的app的通知可以弹出来&#xff0c;我的不行&#xff0c;搞了半天原来是这个属性在作怪&#xff0c;示例如下&#xff1a; class Ma…