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

news2024/9/23 11:28:07

系列文章目录


目录

  • 系列文章目录
  • 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. 逆波兰表达式求值


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

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

相关文章

探索区块链世界:从加密货币到去中心化应用

相信提到区块链&#xff0c;很多人会想到比特币这样的加密货币&#xff0c;但实际上&#xff0c;区块链技术远不止于此&#xff0c;它正在深刻地改变我们的生活和商业。 首先&#xff0c;让我们来简单了解一下什么是区块链。区块链是一种分布式数据库技术&#xff0c;它通过将…

MySQL的insert-on-duplicate语句详解

一、insert-on-duplicate语句语法 注意&#xff1a;ON DUPLICATE KEY UPDATE只是 MySQL的特有语法&#xff0c;并不是SQL标准语法&#xff01; INSERT INTO … ON DUPLICATE KEY UPDATE 是 MySQL 中一种用于插入数据并处理重复键冲突的语法。 这个语法适用于在 insert的时候…

操作系统核心知识点大梳理

计算机结构 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时&#xff0c;先从内存中取出第一条指令&#xff0c;通过控制器的译码&#xff0c;按指令的要求&#xff0c;从存储器中取出数据进行指定的运算和逻辑操作等加工&#xff0c;然后再按地址把结果送到内存中去…

做跨境用哪种代理IP比较好?怎么选到干净的IP?

代理IP对于做跨境的小伙伴来说&#xff0c;都是必不可少的工具&#xff0c;目前出海的玩法已经是多种多样&#xff0c;开店、账号注册、短视频运营、直播带货、网站SEO等等都是跨境人需要涉及到的业务。而国外代理IP的获取渠道非常多&#xff0c;那么做跨境到底应该用哪种代理I…

Servlet两种配置

通过xml配置 <servlet><servlet-name>MyServlet</servlet-name><servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/MyServlet</ur…

Excel数据可视化

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

传值、传址、空间释放详细图解

目录 前言 一.进程 1.1 进程的映射 1.2 进程的虚拟空间 二.函数传参 2.1 函数传参 2.2 函数传值 2.2.1 函数传值案例1 2.2.2 函数传值案例2 2.2.3 返回值为常量 2.3 函数传送地址 2.3 字符串使用 前言 详细介绍函数传值和传地址区别&#xff1a;进行数据操作的区别&#xff0c…

08|记忆:通过Memory记住客户上次买花时的对话细节

无论是LLM还是代理都是无状态的&#xff0c;每次模型的调用都是独立于其他交互的。也就是说&#xff0c;我们每次通过API开始和大语言模型展开一次新的对话&#xff0c;它都不知道你其实昨天或者前天曾经和它聊过天了。 使用ConversationChain from langchain import OpenAI…

中国国际光伏展

河北省京津冀国际光伏展是一个旨在推动光伏产业发展的展览会。该展览会的举办地点在河北省&#xff0c;也被称为京津冀地区&#xff0c;这个地区是中国重要的经济发展区域之一&#xff0c;拥有丰富的太阳能资源和光伏产业基础。 光伏展览会将展示最新的光伏技术、产品和解决方案…

ABS210-ASEMI新能源专用整流桥ABS210

编辑&#xff1a;ll ABS210-ASEMI新能源专用整流桥ABS210 型号&#xff1a;ABS210 品牌&#xff1a;ASEMI 封装&#xff1a;ABS-4 正向电流&#xff08;Id&#xff09;&#xff1a;2A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;3…

Fabric.js在vue2中使用

Fabric.js安装 这里我是基于vue来使用的&#xff0c;先安装上Fabric.js npm install fabric 在main.js中 import fabric from fabric Vue.use(fabric);Fabric 提供了 7 种基础形状&#xff1a; fabric.Circle (圆)fabric.Ellipse (椭圆)fabric.Line (线)fabric.Polyline (多条…

汽车电子零部件(8):T_Box

前言: 网联汽车(Connected Vehicles ,CV)是一个广泛的概念,四个主要的CV线程已发展起来:互联、自主、共享和电动。这些应用于包括CV在内的垂直领域:汽车、通信、互联网和共享手机服务。中国汽车工程师学会(SAEC)提倡将车载ADAS(高级驾驶员辅助系统)与通信技术相结合…

概述工业4.0时代的数据采集

在当今全球制造业转型升级的大潮中&#xff0c;工业4.0以其智能化、网络化和个性化的特征&#xff0c;引领了新的工业革命。其中&#xff0c;数据采集作为工业4.0的核心要素&#xff0c;是实现智能制造的关键环节&#xff0c;它的重要性不言而喻。 工业4.0时代的数据采集&#…

Linux中判断某个Docker容器服务的内存是否超过临界值,比如到达10G,则在凌晨4点执行定时任务执行重新构建命令

监测NAME是blade-jiangxinzhougarden的服务&#xff0c;如果内存&#xff08;MEM USAGE&#xff09;超过10G则在凌晨4点执行重新构建命令 1.编写脚本文件restart_jxz.sh #!/bin/bash# 设置要监控的容器名称或服务名称(替换成你的服务名) SERVICE_NAME"blade-jiangxinzhou…

SpringSecurity(SpringBoot2.X版本实现)

资料来源于 SpringSecurity框架教程-Spring SecurityJWT实现项目级前端分离认证授权 侵权删 目录 介绍 快速开始 认证 认证流程 登录校验流程 SpringSecurity完整流程 认证流程详解 代码实现 准备工作 mysql mybatis-plus redis 统一返回类 核心代码 密码加密存…

前端UI框架是不是大厂给中小企业“画地为牢”?

先说结论&#xff1a;不能说全是吧&#xff0c;但也大部分是。大厂赏饭&#xff08;开源&#xff09;给你吃&#xff0c;你就得按照他的规矩来。 一、大厂为什么喜欢开源 大厂愿意开源他们的前端框架有以下几个原因&#xff1a; 社区贡献&#xff1a;开源框架可以吸引更多的开…

【简写Mybatis】04-数据源的解析、创建和使用

前言 在学习MyBatis源码文章中&#xff0c;斗胆想将其讲明白&#xff1b;故有此文章&#xff0c;如有问题&#xff0c;不吝指教&#xff01; 注意&#xff1a; 学习源码一定一定不要太关注代码的编写&#xff0c;而是注意代码实现思想&#xff1b; 通过设问方式来体现代码中的…

Redis中的String编码转换底层原理及6.0新特性

String编码转换底层原理 String对象为什么把大于39字节或者44字节的字符串编码为raw&#xff0c;小于的时候编码为embstr? 在Redis3.2以前的版本中,SDS作为字符串类型中存储字符串内容的结构&#xff0c;源码如下&#xff1a; 3.2版本SDS结构 struct sdshdr {// 记录buf数…

【DFS】树的重心

树的邻接表 存储方式 int N; int h[N];//存以N为编号的节点的下一个节点的idx int e[2N];//存idx的节点的编号 int nex[2N];//存idx节点的下一个节点的idxvoid add(int a, int b){ e[idx] b; nex[idx] h[a]; h[a]idx; }dfs遍历方式&#xff1a; void dfs(int u){state[u]…

day6 3/18

2.试编程&#xff1a; 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&#xff08;整…