基础知识

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. 【每日一题】【链表or双指针循环条件】2022年2月26日-NC96 判断一个链表是否为回文结构

    描述给定一个链表,请判断该链表是否为回文结构.回文是指该字符串正序逆序完全一致. 思路: public boolean isPail (ListNode head) { ListNode node = ...

  2. K8S的架构及工作原理

    1.Master和Node 1).Master K8S中的Master是集群控制节点,负责整个集群的管理和控制 在Master上运行着以下关键进程: kube-apiserver:提供了HTTP Re ...

  3. 2022年Kubernetes CKA 认证真题解析完整版

    第一题 RBAC授权问题权重: 4% 设置配置环境:[student@node-1] $ kubectl config use-context k8s Context为部署管道创建一个新的Cluste ...

  4. ArcObjects SDK开发 011 RasterLayer

    1.RasterLayer的结构 图层的话,除了FeatureLayer外,用的最多的就是RasterLayer了.较FeatureLayer而言,RasterLayer比较简单,这点可以从栅格图层的 ...

  5. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(36)-掌握Fiddler中Fiddler Script用法,你会有多牛逼-上篇

    1.简介 Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有 ...

  6. 【机器学习】李宏毅——自注意力机制(Self-attention)

    前面我们所讲的模型,输入都是一个向量,但有没有可能在某些场景中输入是多个向量,即一个向量集合,并且这些向量的数目并不是固定的呢? 这一类的场景包括文字识别.语音识别.图网络等等. 那么先来考虑输出的类 ...

  7. 如何在路由绑定中使用 IParsable

    IParsable 是 .Net 7 中新增的接口,它可以将字符串转换为对应的实体.在 Controller 的 Route 绑定中可以使用 IParsable 来绑定复杂的实体. 实验背景 假设有一 ...

  8. Linux基础守护进程、高级IO、进程间通信

    守护进程(Daemon) 前言 Linux常用于服务器,程序通常不运行在前台.运行于前台的进程和终端关联,一旦终端关闭,进程也随之退出.因为守护进程不和终端关联,因此它的标准输出和标准输入也无法工作, ...

  9. 教你用JavaScript实现乘法游戏

    案例介绍 欢迎来的我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个乘法积分游戏.乘法游戏主要通过用户输入的数值和程序计算的数值进行对比,正确积一分,错 ...

  10. [OpenCV实战]4 OpenCV中的颜色空间

    目录 1 不同的色彩空间 1.1RGB颜色空间 1.2 Lab色彩空间 1.3  YCrCb颜色空间 1.4 HSV颜色空间 2 如何使用这些颜色空间进行分割 2.1 获取特定颜色的颜色值 2.2 应 ...