代码随想录算法训练营day11 | leetcode 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
基础知识
String StringBuilder 操作
public class StringOperation {
int startIndex;
int endIndex;
{
//初始容量为16个字符 主要做增删查改 索引包头不包尾
StringBuilder sb = new StringBuilder();
sb.append("str");
// 把原来index上的元素挪到新添加的元素位置后
sb.insert(1, "str");
sb.deleteCharAt(1);
sb.delete(1, 2);
sb.length();
sb.capacity();
sb.charAt(1);
// 找不到返回-1
sb.indexOf("char");
sb.indexOf("char", 1);
sb.lastIndexOf("str");
sb.lastIndexOf("str", 1);
sb.substring(1);
sb.substring(1,3);
sb.setCharAt(1,'c');
sb.reverse(); // String是final的,肯定没有reverse方法
sb.replace(1, 2, "str");
sb.toString();
}
{
// 做替换、大小写变换、分割、清除空格、字符数组互换
String str= new String();
String string= new String();
str.trim();
str.toLowerCase();
str.toUpperCase();
str.compareTo(string);
str.split(" ");
str.replace("old", "new");
str.replaceAll("%d","123");
str.substring(startIndex,endIndex);
str.substring(1);
List<Character> list = str.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
str.chars().mapToObj(c -> (char) c).forEach(System.out::println);
Collections.frequency(list, 'a');
// 对字符串升序排列
char[] ar = str.toCharArray();
Arrays.sort(ar);
String str11 = String.valueOf(ar);
}
}
LeetCode 20. 有效的括号
分析1.0
三种括号,22匹配,遇到左括号入栈,遇到右括号出栈
class Solution {
public boolean isValid(String s) {
HashMap map = new HashMap();
map.put(')','(');
map.put('}','{');
map.put(']','[');
ArrayDeque<Character> stack = new ArrayDeque();
for(int i = 0; i < s.length(); i++){
if(s.charAt(i)==('(') || s.charAt(i)==('{') || s.charAt(i)==('[')){
stack.push(s.charAt(i));
}else if(s.charAt(i)==(')') || s.charAt(i)==('}') || s.charAt(i)==(']')){
if(stack.isEmpty()){
return false;
}else{
if(map.get(s.charAt(i)).equals(stack.pop())){
continue;
}else{
return false;
}
}
}
}
return stack.isEmpty() ? true : false;
}
}
失误
Map、Stack这种容器里存放的都是封装类,比较相等时要使用equals,基本数据类型的比较使用==
return stack.isEmpty() ? true : false; 直接返回stack.isEmpty()就行
LeetCode 1047. 删除字符串中的所有相邻重复项
分析1.0
删除相邻重复项,删除之后索引总长度会改变
失误
我的思路是想再原来的String上操作,但这样是错误的,最后的结果应该是在Stack里头
class Solution {
public String removeDuplicates(String s) {
if(s == null || s.length() < 2){
return s;
}
//StringBuilder sb = new StringBuilder(s);
ArrayDeque<Character> stack = new ArrayDeque();
for(int i = 0; i < s.length(); i++){
char ch = s.charAt(i);
if(stack.isEmpty()){
stack.push(ch);
continue;
}
if(ch == stack.peek()){
stack.pop();
//sb.deleteCharAt(i); // delete后sb长度改变
}else{
stack.push(ch);
}
}
StringBuilder res = new StringBuilder();
while(!stack.isEmpty()){
res.append(stack.pop());
}
return res.reverse().toString();
}
}
这种拼接还挺有意思的 省了reverse
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
LeetCode 150. 逆波兰表达式求值
分析1.0
逆波兰表达式(后缀表达式)主要有以下两个优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
思路
① 如何识别算符和数字 ② 延伸 0-9的ascll字符如何比较大小、实现 char 与 int 转换(这种时候可以打印日志 | 判断元素类型)③ 单个字符如何实现String 与 char 转换 charAt() toCharArray()
失误
// char ch = tokens[i].charAt(0); 两位数就完犊子了 数字字符可能有多位,而算符只能是一位
分析2.0
class Solution {
public int evalRPN(String[] tokens) {
ArrayDeque<Integer> stack = new ArrayDeque();
for(int i = 0; i < tokens.length; i++){
// char ch = tokens[i].charAt(0); 两位数就完犊子了
String str = tokens[i];
if(str.equals("+")){
stack.push(stack.pop() + stack.pop());
}else if(str.equals("-")){
stack.push(0 - stack.pop() + stack.pop());
}else if(str.equals("*")){
stack.push(stack.pop() * stack.pop());
}else if(str.equals("/")){
int a = stack.pop();
stack.push(stack.pop() / a);
}else{
stack.push(Integer.parseInt(str));
}
}
return stack.pop();
}
}
总结
- Map、Stack这种容器里存放的都是封装类,比较相等时要使用equals,基本数据类型的比较使用==
- 22成对出现且涉及查找等相关操作时,注意使用Map或栈
- 匹配问题——栈、Map
- 栈能保存上一个访问过的元素
- String.charAt(i)是一个char 不是一个String
- char ch = tokens[i].charAt(0); 两位数就完犊子了 数字字符可能有多位,而算符只能是一位
- ASCLL 字符阿拉伯数组的int值 int val = '9' - '0'
- Integer.parseInt(s)是把字符串解析成int基本类型,Integer.valueOf(s)是把字符串解析成Integer对象类型。jdk规定,每次要创建一个value值在-128~127之间的Integer对象时,直接从缓存中拿到这个对象,所以value值相同的Integer对象都是对应缓存中同一个对象。-128~127之外的整数值用的不是太频繁,每次创建value值相同的Integer对象时,都是重新创建一个对象
常用变量名增量更新
size、val、ans、cnt、cur、pre、next、left、right、index、gap、tar、res、src、len、start、end、flag、ch
代码随想录算法训练营day11 | leetcode 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值的更多相关文章
- LeetCode 1047. 删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates In String)
1047. 删除字符串中的所有相邻重复项 1047. Remove All Adjacent Duplicates In String 题目描述 LeetCode1047. Remove All Ad ...
- 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...
- LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24
150. 逆波兰表达式求值 150. Evaluate Reverse Polish Notation 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, /.每个运算对象 ...
- LeetCode.1047-重复删除字符串中的所有相邻重复项
这是小川的第389次更新,第419篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第251题(顺位题号是1047).给定一个小写字母的字符串S,重复删除两个相邻且相等的字母 ...
- Leetcode 150.逆波兰表达式求值
逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总 ...
- Java实现 LeetCode 150 逆波兰表达式求值
150. 逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波 ...
- leetcode算法学习----逆波兰表达式求值(后缀表达式)
下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目: 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...
- 【python】Leetcode每日一题-逆波兰表达式求值
[python]Leetcode每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...
- LeetCode:逆波兰表达式求值【150】
LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...
- 逆波兰表达式求值 java实现代码
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
随机推荐
- mysql-front连接mysql报错1251解决方法
客户端不通过服务器的验证,建议升级mysql客户端 出现错误的原因是mysql版本问题,由于mysql8.0版本与mysql5.0版本加密方式不同,导致mysql-front无法通过验证. mysql ...
- 总算给女盆友讲明白了,如何使用stream流的filter()操作
一.引言 在上一篇文章中<这么简单,还不会使用java8 stream流的map()方法吗?>分享了使用stream的map()方法,不知道小伙伴还有印象吗,先来回顾下要点,map()方法 ...
- Zabbix技术分享——使用docker-compose快速部署zabbix监控系统
前面文章有提到过使用docker来快速拉起一个zabbix监控系统(详见:如何使用docker快速部署一个zabbix监控系统),但是要一个个执行docker启动命令去将对应的容器启动.如果要配置参数 ...
- 【kafka】JDBC source&sink connect实现数据从Oracle实时同步插入更新到PostgreSQL(PG)
〇.所需资料 1.JDBC connect的plugins下载地址(confluent) 一.Oracle建表 1.表规划 表名:Test_TimeFormat_Order.Test_Stress_O ...
- 【SQL基础】【关键字大写】条件查询:比较、不等于、IN、为空、BETWEEN
〇.概述 1.内容介绍 条件查询:比较.不等于.IN.为空.BETWEEN 2.建表语句 drop table if exists user_profile; CREATE TABLE `user_p ...
- Kubernetes-基于容器云构建devops平台
1.基于kubernetes devops的整体方案 本文以Kubernetes为基础,为基于java语言研发团队提供一套完整的devops解决方案.在此方案中,开发人员基于eclipse集成开发环境 ...
- java时区相关问题(被恶心到了)
在项目开发中,遇到了mysql5.7数据库相关的时区问题.整理如下: 问题一:在使用swagger测试接口时,数据库记录的时间和输入的不一致.如下图: swagger中输入的是:"recei ...
- 体验 Gitea Actions
即将推出的 Gitea Actions 致力于打造一个 CI/CD 工具的标准协议,第三方 CI 系统可以基于actions 协议与 Gitea 平台集成,提供一站式管理方案.Gitea Action ...
- [机器学习] Yellowbrick使用笔记6-分类可视化
分类模型试图在一个离散的空间中预测一个目标,即为一个因变量实例分配一个或多个类别. 代码下载 分类分数可视化工具显示类之间的差异以及一些特定于分类器的可视化评估.我们目前已经实施了以下分类器评估: 分 ...
- IT编程相关内容汇总 - 进阶者系列 - 学习者系列文章
笔者工作了十多年了,对于技术也有一定的经验,但是IT编程技术的更新是挺快的,特别是各种框架,各种中间件啥的都涌现出来了.这篇博文笔者打算将IT编程的前端.后端.数据库和移动端做一个博文知识汇总,让阅读 ...