代码随想录-算法训练营day11【栈与队列02:有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客

第五章 栈与队列part02
今日内容: ● 20. 有效的括号
● 1047. 删除字符串中的所有相邻重复项
● 150. 逆波兰表达式求值详细布置 20. 有效的括号 讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。 大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html  1047. 删除字符串中的所有相邻重复项 栈的经典应用。 要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。题目链接/文章讲解/视频讲解:https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html150. 逆波兰表达式求值 本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题 题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html

目录

0020_有效的括号

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

1、ArrayDeque

2、StringBuffer对象

3、char[]用法

0150_逆波兰表达式求值

1、==操作符与equals()方法

2、Character.isDigit(char ch)


0020_有效的括号

写的过程中有很多情况没有考虑到位,导致错了四次。

import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;class Solution0020 {public boolean isValid(String s) {if (s.length() % 2 != 0) {return false;}Stack<Character> stack = new Stack<>();for (int i = 0; i < s.length(); i++) {char ch = s.charAt(i);if (ch == '(' || ch == '[' || ch == '{') {stack.push(ch);} else if (ch == ')') {if (stack.isEmpty()) {return false;}if (!stack.isEmpty() && stack.pop() != '(') {return false;}} else if (ch == ']') {if (stack.isEmpty()) {return false;}if (!stack.isEmpty() && stack.pop() != '[') {return false;}} else if (ch == '}') {if (stack.isEmpty()) {return false;}if (!stack.isEmpty() && stack.pop() != '{') {return false;}}}if (stack.isEmpty()) {return true;} else {return false;}}public boolean isValid2(String s) {Deque<Character> deque = new LinkedList<>();char ch;for (int i = 0; i < s.length(); i++) {ch = s.charAt(i);//碰到左括号,就把相应的右括号入栈if (ch == '(') {deque.push(')');} else if (ch == '{') {deque.push('}');} else if (ch == '[') {deque.push(']');} else if (deque.isEmpty() || deque.peek() != ch) {return false;} else {//如果是右括号判断是否和栈顶元素匹配deque.pop();}}//最后判断栈中元素是否匹配return deque.isEmpty();}
}

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

1、ArrayDeque

//ArrayDeque会比LinkedList在除了删除元素这一点外,会快一点。

是的,ArrayDeque 在除了删除元素之外的大多数操作上通常会比 LinkedList 快一些。这是因为 ArrayDeque 使用数组作为其内部数据结构,而 LinkedList 使用链表。
//参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
ArrayDeque<Character> deque = new ArrayDeque<>();//使用 Deque 作为堆栈

2、StringBuffer对象

也可以用 StringBuilder 来修改字符串,速度更快
StringBuffer res = new StringBuffer();
res.deleteCharAt(top);


这段代码首先创建了一个 StringBuffer 对象 res,然后调用了该对象的 deleteCharAt(top) 方法。

deleteCharAt(int index) 方法用于删除指定索引位置的字符,其中 index 参数表示要删除的字符在字符串缓冲区中的位置。在这段代码中,top 是一个变量,用来表示要删除的字符的索引位置。

因此,这行代码的作用是删除 res 字符串缓冲区中索引为 top 的字符。

StringBuffer 是 Java 中用于处理可变字符串的类,它允许在字符串中进行插入、追加、删除和修改等操作,而不会创建新的字符串对象。下面是一些 StringBuffer 的常用方法:

  1. append(String str):将指定的字符串追加到字符串缓冲区的末尾。

    StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); System.out.println(sb.toString()); // 输出: Hello World

  2. insert(int offset, String str):在指定的位置插入指定的字符串。

    StringBuffer sb = new StringBuffer("Hello"); sb.insert(5, " World"); System.out.println(sb.toString()); // 输出: Hello World

  3. delete(int start, int end):删除从 startend-1 位置的字符。

    StringBuffer sb = new StringBuffer("Hello World"); sb.delete(5, 11); System.out.println(sb.toString()); // 输出: Hello

  4. deleteCharAt(int index):删除指定位置的字符。

    StringBuffer sb = new StringBuffer("Hello World"); sb.deleteCharAt(5); System.out.println(sb.toString()); // 输出: Hell World

  5. replace(int start, int end, String str):用新字符串替换指定位置的字符序列。

    StringBuffer sb = new StringBuffer("Hello World"); sb.replace(6, 11, "Java"); System.out.println(sb.toString()); // 输出: Hello Java

  6. reverse():反转字符串。

    StringBuffer sb = new StringBuffer("Hello"); sb.reverse(); System.out.println(sb.toString()); // 输出: olleH

StringBufferStringBuilder 类似,但是 StringBuffer 是线程安全的,因为它的方法都是同步的。因此,在单线程环境下,推荐使用 StringBuilder,因为它的性能更好。

3、char[]用法

char[] ch = s.toCharArray();
return new String(ch, 0, slow);


在这段代码中,new String(ch, 0, slow) 是用来创建一个新的字符串对象的。它接受三个参数:

  1. ch:一个字符数组,是新字符串的内容来源。
  2. 0:起始索引,表示从字符数组的第一个字符开始。
  3. slow:长度,表示新字符串的长度,即从字符数组中提取的字符数量。

因此,这行代码的作用是从字符数组 ch 中提取前 slow 个字符,并将它们拼接成一个新的字符串对象。

import java.util.Stack;public class _1047_删除字符串中的所有相邻重复项 {public static void main(String[] args) {Solution1047 solution1047 = new Solution1047();solution1047.removeDuplicates("abbaca");}
}/*** 输入:"abbaca"* 输出:"ca"*/
class Solution1047 {public String removeDuplicates(String s) {Stack<Character> stack = new Stack<>();stack.push(s.charAt(0));for (int i = 1; i < s.length(); i++) {if (!stack.isEmpty() && stack.peek() == s.charAt(i)) {if (!stack.isEmpty()) {stack.pop();}continue;}stack.push(s.charAt(i));}
//        StringBuilder sb = new StringBuilder();
//        while (!stack.isEmpty()) {
//            sb.append(stack.pop());
//        }
//        return sb.reverse().toString();String res = "";while (!stack.isEmpty()) {res += stack.pop();}return res;}}

0150_逆波兰表达式求值

1、==操作符equals()方法

在Java中,== 操作符用于比较两个对象的引用是否相等,而 equals() 方法用于比较两个对象的内容是否相等。

具体来说:

  • == 操作符比较的是对象的引用,即它们是否指向内存中的同一个对象。如果两个字符串使用 == 操作符比较,它们只有在指向同一个内存地址时才会返回 true,即它们是同一个对象。
  • equals() 方法用于比较两个对象的内容是否相等。对于字符串对象,它比较的是字符串的字符序列是否相同。如果两个字符串对象的字符序列相同,则 equals() 方法返回 true,否则返回 false

总的来说,使用 == 操作符来比较字符串通常不会得到预期的结果,因为它比较的是对象的引用而不是内容。因此,通常情况下我们会使用 equals() 方法来比较字符串是否相等。

2、Character.isDigit(char ch)

(tokens[i].length() > 1 && tokens[i].charAt(0) == '-')   这个地方卡了很久!

这段代码是一个条件表达式,它包含两个部分,使用逻辑与操作符 && 连接起来。

  1. (tokens[i].length() > 1):这部分检查字符串的长度是否大于1。这是因为如果一个字符串只有一个字符且这个字符是负号 -,那么它不表示负数,而是一个运算符,例如 -2 表示减法运算符 - 和数字 2
  2. tokens[i].charAt(0) == '-':这部分检查字符串的第一个字符是否是负号 -

因此,整个条件表达式检查的是输入的字符串是否表示一个负数。如果字符串的长度大于1且第一个字符是 -,那么这个字符串就表示一个负数。

Character.isDigit(char ch) 是 Java 中的一个静态方法,用于检查给定的字符是否是一个数字字符(即 '0' 到 '9' 之间的字符)。

具体来说,如果指定的字符是一个数字字符,则该方法返回 true,否则返回 false

import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;public class _0150_逆波兰表达式求值 {public static void main(String[] args) {Solution0150 solution0150 = new Solution0150();String[] tokens1 = {"2", "1", "+", "3", "*"};System.out.println(solution0150.evalRPN(tokens1));String[] tokens2 = {"4", "13", "5", "/", "+"};System.out.println(solution0150.evalRPN(tokens2));String[] tokens3 = {"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"};System.out.println(solution0150.evalRPN(tokens3));}
}class Solution0150 {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (int i = 0; i < tokens.length; i++) {if (Character.isDigit(tokens[i].charAt(0)) || (tokens[i].length() > 1 && tokens[i].charAt(0) == '-')) {//数字stack.push(Integer.parseInt(tokens[i]));} else {//符号:+ - * /int a = stack.pop();int b = stack.pop();if (tokens[i].equals("+")) {stack.push(b + a);} else if (tokens[i].equals("*")) {stack.push(b * a);} else if (tokens[i].equals("-")) {stack.push(b - a);} else if (tokens[i].equals("/")) {stack.push(b / a);}}}return stack.pop();}
}class Solution0150_2 {public int evalRPN(String[] tokens) {Deque<Integer> stack = new LinkedList();for (String s : tokens) {if ("+".equals(s)) {//leetcode内置jdk的问题,不能使用==判断字符串是否相等stack.push(stack.pop() + stack.pop());//注意 - 和 / 需要特殊处理} else if ("-".equals(s)) {stack.push(-stack.pop() + stack.pop());} else if ("*".equals(s)) {stack.push(stack.pop() * stack.pop());} else if ("/".equals(s)) {int temp1 = stack.pop();int temp2 = stack.pop();stack.push(temp2 / temp1);} else {stack.push(Integer.valueOf(s));}}return stack.pop();}
}

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

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

相关文章

车载摄像头智能颜色校正解决方案,卓越画质新体验

随着智能交通和自动驾驶技术的快速发展&#xff0c;车载摄像头作为车辆感知外界环境的重要部件&#xff0c;其画面质量对于行车安全和用户体验至关重要。然而&#xff0c;由于光线变化、设备差异以及拍摄环境复杂多变&#xff0c;车载摄像头拍摄的画面往往会出现颜色失真、对比…

管理 nodejs 版本工具 nvm

nvm 方便切换不同版本的 node 及 对应的 npm 版本 一、安装nvm nvm官网 &#xff08;内含下载的文件&#xff0c;点击进去下载&#xff0c;并按照 网站文档步骤 操作即可&#xff09; 二、nvm 基础命令 nvm arch&#xff1a;显示node是运行在32位还是64位。nvm install <…

32.5k star!发现一个新的 API 调试工具!postman 要被替换了【文末有项目源码】

在软件开发过程中&#xff0c;API&#xff08;应用程序接口&#xff09;扮演着至关重要的角色。为了确保 API 的可靠性和性能&#xff0c;开发人员需要一种高效的方式来测试和调试它们。这方面的工具&#xff0c;大家经常用到的应该就是 postman 了。不过&#xff0c;今天想要给…

[Qt网络编程]之获取基本网络信息

前言 获取主机的网络地址和接口信息是进行网络编程的第一步&#xff0c;也是网络编程的基础。Qt提供了网络接口类 QNetworkInterface、网络地址人口类 QNetworkAddressEntry 和主机地址类 QHostAddress 来获取和使用地址信息。其中网络接口类 QNetworkInterface 描述了主机的卫…

短信防刷之滑动验证码

前言&#xff1a;最近想写一个滑动验证码&#xff0c;前台的样式虽然很好看&#xff0c;但是并不安全&#xff0c;网上也都是一些demo&#xff0c;不是前后台分离的&#xff0c;然后就自己查资料&#xff0c;自己来完成了 滑动验证码 一、为什么要使用滑动验证码 首先&#x…

斯坦福大学2024年人工智能发展和前景全面分析报告

2024 年指数是斯坦福大学迄今为止最全面的指数&#xff0c;恰逢人工智能对社会的影响力达到前所未有的重要时刻。今年&#xff0c;斯坦福大学扩大了研究范围&#xff0c;更广泛地涵盖人工智能的技术进步、公众对该技术的看法以及围绕其发展的地缘政治动态等基本趋势。 完整详细…

onedrive 清理文件历史版本 节省空间

onedrive 清理文件历史版本以节省空间的操作步骤 起因&#xff1a; 用的好好的onedrive高校教育版&#xff0c;突然在2024年4月2日晚上把空间从1T回收到100G&#xff0c;然后文件爆满&#xff0c;虽然没有把文件都给我删了&#xff0c;但是可能几个月窗口期过去就没文件了。而…

2024年——区块链技术进入全新高度

BTC生态蓬勃发展&#xff0c;以太坊的L1和L2模块化重塑智能合约生态。RAAS&#xff08;区块链即服务&#xff09;、Depin、并行EVM等技术的崛起&#xff0c;为区块链应用提供了更高的性能和可扩展性。以太坊再质押成为焦点。技术创新与日俱进&#xff0c;一同探索这个充满活力的…

KVM部署

1、检查虚拟化支持 首先&#xff0c;确认你的系统处理器支持硬件虚拟化&#xff0c;在Linux终端中&#xff0c;使用以下命令&#xff1a; egrep -c (vmx|svm) /proc/cpuinfo2、安装KVM及其工具 yum update yum install qemu-kvm libvirt libvirt-python libguestfs-tools vi…

10-菜刀连接木马

找到了漏洞后&#xff0c;并且上传了木马之后才能使用的两款工具 中国菜刀和冰蝎 想办法获取别人的cookie&#xff0c;cookie中有session-id 一、中国菜刀 1、必须提前已经完成木马植入然后才能使用 2、木马必须是POST请求&#xff0c;参数自定义&#xff0c;在菜刀里给出…

机器学习与深度学习 --李宏毅(笔记与个人理解)Day 20

Day 20 RNN 2 实际使用和其他应用 在实际的学习&#xff08;training&#xff09;过程中是如何工作的&#xff1f; step 1 Loss step 2 training Graindent Descent 反向传播的进阶版 – BPTT CLIpping 设置阈值~ 笑死昨天刚看完关伟说的有这玩意的就不是好东西 Why&#xff1…

C语言趣味代码(一)

C语言相关知识点的博客和大家分享完了&#xff0c;接下来我想开始数据结构相关的博客&#xff0c;在此之前呢&#xff0c;有的小伙伴问过我学完C语言的相关知识&#xff0c;我能干些什么呢&#xff1f;只有刷题吗&#xff1f;这不禁让我反思&#xff1a;在我们学习的过程中&…

远程DCS监控

在数字化、智能化的浪潮中&#xff0c;工业控制系统正迎来前所未有的变革。分布式控制系统&#xff08;DCS&#xff09;作为工业自动化领域的核心&#xff0c;其稳定运行对于企业的生产效率和安全至关重要。而远程DCS监控作为实现工业自动化、智能化管理的关键一环&#xff0c;…

【wpf】ObservableCollection 跨线程报错问题

背景 ObservableCollection 我们之前介绍过他和List的区别。ObservableCollection 的好处在于&#xff0c;当集合发生变化时&#xff0c;能发送通知通知界面发生相应的更改。但是ObservableCollection 有个弊端。无法在非UI线程中访问。 要么就是通知失效了&#xff0c;要么就…

MySQL修改数据表的结构

创建数据库 -- create database 创建的数据库名; create database test; 这里创建了一个名为 test 的数据库 选择需要使用的数据库 -- use 数据库名; use test; 这里使用 test 数据库 创建数据表 -- create table 表名(字段名1 数据类型(长度) 约束,字段名2 数据类型(长…

【强化学习的数学原理-赵世钰】课程笔记(九)策略梯度方法(Policy Gradient Method)

目录 一.policy gradient 的基本思路&#xff08;Basic idea of policy gradient&#xff09; 二.定义最优策略的 metrics&#xff0c;也就是 objective function 是什么 三.objective function 的 gradient 四.梯度上升算法&#xff08;REINFORCE&#xff09; 五.总结 上…

企业常用命令(touch/别名/重定向/Linux字符)7368字详谈

企业高薪思维&#xff1a; 企业&#xff08;工作/学习中&#xff09;操作前备份&#xff0c;操作后检查 最小化原则 1.安装软件最小化 2.参数选项最小化 3.登录用户权限最小化&#xff08;不用root登录&#xff09; 要想成功/学习上/工作上 永远比别人多做一点点&#xff08;别…

幻兽帕鲁老板公开发声:腾讯正在制作幻兽帕鲁克隆版

昨天&#xff0c;Pocketpair的老板出来指责中国游戏公司抄袭了他们的游戏Palworld&#xff0c;说这简直是太不可思议了。 Pocketpair的CEO Takuro Mizobe发布了一个叫Auroria的游戏的截图&#xff0c;然后说&#xff1a;“腾讯正在制作Palworld的克隆游戏&#xff01;在中国&a…

Python根据主播直播时间段判定订单销售额归属

写在前面&#xff1a;最近在群里看到一个这样的直播电商的场景觉得还是挺有趣的&#xff0c;于是就想用Python来实现。 需求描述&#xff1a;根据主播直播时间段结合销售订单的付款时间判断所属销售的归属 生成主播在线直播时间段数据 from datetime import datetime, time…

zabbix监控配置(添加主机、主机组和添加监控项等)

zabbix监控配置 文章目录 zabbix监控配置1.添加主机组2.添加主机&#xff08;linux&#xff09;3.添加主机&#xff08;windows&#xff09;4.监控项配置&#xff08;通过模板添加&#xff09;5.监控项配置&#xff08;手动添加&#xff09; 1.添加主机组 2.添加主机&#xff0…