基础知识

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();
}
}

总结

  1. Map、Stack这种容器里存放的都是封装类,比较相等时要使用equals,基本数据类型的比较使用==
  2. 22成对出现且涉及查找等相关操作时,注意使用Map或栈
  3. 匹配问题——栈、Map
  4. 栈能保存上一个访问过的元素
  5. String.charAt(i)是一个char 不是一个String
  6. char ch = tokens[i].charAt(0); 两位数就完犊子了 数字字符可能有多位,而算符只能是一位
  7. ASCLL 字符阿拉伯数组的int值 int val = '9' - '0'
  8. 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. 逆波兰表达式求值的更多相关文章

  1. LeetCode 1047. 删除字符串中的所有相邻重复项(Remove All Adjacent Duplicates In String)

    1047. 删除字符串中的所有相邻重复项 1047. Remove All Adjacent Duplicates In String 题目描述 LeetCode1047. Remove All Ad ...

  2. 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

    第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...

  3. LeetCode 150. 逆波兰表达式求值(Evaluate Reverse Polish Notation) 24

    150. 逆波兰表达式求值 150. Evaluate Reverse Polish Notation 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, /.每个运算对象 ...

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

    这是小川的第389次更新,第419篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第251题(顺位题号是1047).给定一个小写字母的字符串S,重复删除两个相邻且相等的字母 ...

  5. Leetcode 150.逆波兰表达式求值

    逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总 ...

  6. Java实现 LeetCode 150 逆波兰表达式求值

    150. 逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波 ...

  7. leetcode算法学习----逆波兰表达式求值(后缀表达式)

    下面题目是LeetCode算法:逆波兰表达式求值(java实现) 逆波兰表达式即后缀表达式. 题目:  有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式.同 ...

  8. 【python】Leetcode每日一题-逆波兰表达式求值

    [python]Leetcode每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...

  9. LeetCode:逆波兰表达式求值【150】

    LeetCode:逆波兰表达式求值[150] 题目描述 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除 ...

  10. 逆波兰表达式求值 java实现代码

    根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...

随机推荐

  1. Linux系统各种库/软件版本输出指令

    日常开发基于Linux系统(其实更多的是Ubuntu平台),平时总会遇到一些情况需要查看某个库或者软件的版本信息,在这里做一下简单的记录. 1. 查看glibc版本 方法一:使用ldd指令 cv@cv ...

  2. Springboot自动装配源码及启动原理理解

    Springboot自动装配源码及启动原理理解 springboot版本:2.2.2 传统的Spring框架实现一个Web服务,需要导入各种依赖JAR包,然后编写对应的XML配置文件 等,相较而言,S ...

  3. 漫谈计算机网络:应用层 ----- 从DNS域名解析到WWW万维网再到P2P应用

    2022-12-04 18:31:01 纪念一下博主的<漫谈计算机网络>连载博客 浏览量破500了! 今天更新完结篇! 面试答不上?计网很枯燥? 听说你学习 计网 每次记了都会忘? 不妨抽 ...

  4. 【实时数仓】Day06-数据可视化接口:接口介绍、Sugar大屏、成交金额、不同维度交易额(品牌、品类、商品spu)、分省的热力图 、新老顾客流量统计、字符云

    一.数据可视化接口介绍 1.设计思路 后把轻度聚合的结果保存到 ClickHouse 中后,提供即时的查询.统计.分析 展现形式:用于数据分析的BI工具[商业智能(Business Intellige ...

  5. sql周报

    数据库分类 1.关系型数据库 Mysql Qracle MariaDB PostgreSQL mysql:开源免费 使用最广 性价比最高 Oracle:收费 但安全性高 PostgreSQL:开源免费 ...

  6. 日爬百万数据的域名限制、url的清洗和管理

    一.域名去重1.检测开头:link.startswith('http') txt = "Hello, welcome to my world." x = txt.startswit ...

  7. 错误:org.springframework.beans.factory.BeanDefinitionStoreException:

    在练习尚硅谷雷丰阳老师的SSM-CRUD整合的时候,因为使用的Thymeleaf,而不是jsp,跟着老师操作所有会出现一些错误,现在我把这些错误都整理一下,希望能帮助到有用的朋友. org.sprin ...

  8. Win10系统安装U盘,安装纯净版Win10的通用教程

    安装前准备:1.准备8G或8G以上U盘(32G以内).2.制作U盘会格式化U盘,U盘内的重要文件也要事先备份好.操作步骤:1.打开微软下载WIN10网址:(如果网址无法打开,可以下载解压运行附件内的工 ...

  9. JavaScript:函数:如何声明和调用函数?

    首先,理解什么是函数? 通俗的说,函数就是用大括号括起来的一组JS语句的集合体,是一个代码块,表达一种行为逻辑. 当我们调用函数的时候,我们就是在执行这一组JS语句. 然后,确定一点,在JS中,函数也 ...

  10. Flutter异常监控 - 贰 | 框架Catcher原理分析

    前言 在给 Flutter 应用做异常监控的时候,一开始我是拒绝滴,如果不考虑 Flutter Engine 和 native 侧的监控,用我另一篇文章中不得不知道的 Flutter 异常捕获知识点 ...