【算法刷题day11】Leetcode:20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

本文主要是介绍【算法刷题day11】Leetcode:20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • Leetcode 20. 有效的括号
      • 解题思路
      • 代码
      • 总结
    • Leetcode 1047. 删除字符串中的所有相邻重复项
      • 解题思路
      • 代码
      • 总结
    • Leetcode 150. 逆波兰表达式求值
      • 解题思路
      • 代码
      • 总结

草稿图网站
java的Deque

Leetcode 20. 有效的括号

题目:20. 有效的括号
解析:代码随想录解析

解题思路

遍历一轮,如果空了则返回true,否则返回false

代码

class Solution {private Stack<Character> stack;private void initialStack(){stack = new Stack<>();}private boolean j(char c){if (c == '(' || c == '[' || c =='{')return true;elsereturn false;}private boolean judge(char c){if (stack.isEmpty())return false;char cStack = stack.peek();if (c == ')' && cStack == '(')return true;if (c == '}' && cStack == '{')return true;if (c == ']' && cStack == '[')return true;return false;} public boolean isValid(String s) {initialStack();int i = 0;while (i < s.length()){char c = s.charAt(i);if (j(c)){stack.push(c);i++;}else{if (judge(c)){stack.pop();i++;}else{return false;}}}return stack.isEmpty();}
}

总结

写的一坨狗屎,多学学carl哥的思路

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('}');else if (!stack.isEmpty() && c == stack.peek())stack.pop();elsereturn false;}return stack.isEmpty();}
}

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

题目:1047. 删除字符串中的所有相邻重复项
解析:代码随想录解析

解题思路

使用栈来消除相同的字符。

代码

class Solution {public String removeDuplicates(String s) {ArrayDeque<Character> deque = new ArrayDeque<>();for (int i = 0; i < s.length(); i++){char c = s.charAt(i);if (!deque.isEmpty() && c == deque.peek())deque.pop();elsedeque.push(c);}String res = "";while (!deque.isEmpty())res = deque.pop() + res;return res;}
}

总结

利用stack效率有点低,直接用StringBuffer当作stack可以从136ms提升到23ms

class Solution {public String removeDuplicates(String s) {StringBuffer res = new StringBuffer();int top = -1;for (int i = 0; i < s.length(); i++){char c = s.charAt(i);if (top >= 0 && c == res.charAt(top))res.deleteCharAt(top--);else{res.append(c);top++;}}return res.toString();}
}

双指针能优化到4ms。(快指针负责遍历,慢指针代表最后输出的结果,如果有重复就回退。然后让遍历的快指针覆盖慢指针。)

class Solution {public String removeDuplicates(String s) {char[] ch = s.toCharArray();int fast = 0;int slow = 0;while(fast < s.length()){// 直接用fast指针覆盖slow指针的值ch[slow] = ch[fast];// 遇到前后相同值的,就跳过,即slow指针后退一步,下次循环就可以直接被覆盖掉了if(slow > 0 && ch[slow] == ch[slow - 1]){slow--;}else{slow++;}fast++;}return new String(ch,0,slow);}
}

Leetcode 150. 逆波兰表达式求值

题目:150. 逆波兰表达式求值
解析:代码随想录解析

解题思路

利用栈

代码

class Solution {Stack<Integer> stack;private void cal(String op){int num2 = stack.pop();int num1 = stack.pop();if (op.equals("+"))stack.push(num1 + num2);else if (op.equals("-"))stack.push(num1 - num2);else if (op.equals("*"))stack.push(num1 * num2);else if (op.equals("/"))stack.push(num1 / num2);}public int evalRPN(String[] tokens) {stack = new Stack<>();for(int i = 0; i < tokens.length; i++){String s = tokens[i];try{stack.push(Integer.parseInt(s));}catch (Exception e) {cal(tokens[i]);}}return stack.peek();}
}

总结


需要优化

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (String s : tokens){if ("+".equals(s))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 num2 = stack.pop();int num1 = stack.pop();stack.push(num1 / num2);}else{stack.push(Integer.parseInt(s));}}return stack.pop();}
}

相同的处理逻辑,减少不必要的函数,提高了速度
在这里插入图片描述

这篇关于【算法刷题day11】Leetcode:20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862007

相关文章

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

mybatisplus的逻辑删除过程

《mybatisplus的逻辑删除过程》:本文主要介绍mybatisplus的逻辑删除过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录myBATisplus的逻辑删除1、在配置文件中添加逻辑删除的字段2、在实体类上加上@TableLogic3、业务层正常删除即

MybatisPlus中removeById删除数据库未变解决方案

《MybatisPlus中removeById删除数据库未变解决方案》MyBatisPlus中,removeById需实体类标注@TableId注解以识别数据库主键,若字段名不一致,应通过value属... 目录MyBATisPlus中removeBypythonId删除数据库未变removeById(Se

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1