代码随想录算法训练营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实现代码
		
根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说 ...
 
随机推荐
- 用excel表画一个乐高
			
一.背景:在商场看到一个超级玛丽的乐高图感觉使用excel的颜色填充也能画出来,并且可以借助python来实现 二.excel表如何绘制正方形:1.统一设置行高与列宽excel表单元格的行与列的默认计 ...
 - 【SQL进阶】Day05:窗口函数
			
〇.概述 一.专用窗口函数 1.每类试卷得分前3名 自己写出来的部分 SELECT tag AS tid, uid AS uid, Rank AS ranking -- 如何确定排名 FROM exa ...
 - 【Java EE】Day04 MySQL多表、事务、事务隔离级别、DCL
			
一.多表查询 1.概述 笛卡尔积:两集合的所有组成情况 多表查询:消除笛卡尔积得到的无用数据 2.分类 内连接查询(满足指定条件无空值,只显示有关联的数据) 隐式内连接:使用where限制消除无用数据 ...
 - Java中的反射机制及反射的优缺点
			
1. 反射的概念 反射 机制指的是,程序在运行时能够获取自身的信息.在 java 中只要给定类的名字,就能够获取类的所有属性和方法. 反射是 Java 中很多高级特性的基础,比如 注解.动态代理 以及 ...
 - Linux 系统用户文件缺失造成“bash-4.2$”错误的解决办法
			
一.问题出现的原因 造成这个现象的原因是因为用户文件夹下的bash_logout.bash_profile和bashrc这三个隐藏文件缺失 二.问题复现 现在删除这三个文件 此时问题出现了 三.问题解 ...
 - MySQL数据结构(索引)
			
目录 一:MySQL索引与慢查询优化 1.什么是索引? 2.索引类型分类介绍 3.不同的存储引擎支持的索引类型也不一样 二:索引的数据结构 1.二叉树(每个节点只能分两个叉) 2.数据结构(B树) 3 ...
 - 使用.NET开发搭建OpenAI模型的中间服务端
			
前言:前不久微信上大家玩ChatGPT聊天机器人玩的不亦乐乎:不过随着ChatGPT被封杀,所以用微信聊天机器人有可能导致封号的风险.那如果自己不想每次都去OpenAI官网上进行对话[PS:官网上面聊 ...
 - oracle创建全文索引(oracle text)
			
drop table test.QQ_MsgRecord; CREATE TABLE test.QQ_MsgRecord ( msg_group VARCHAR2(200), msg_object V ...
 - Unity打包资源,进行后台加载
			
Unity打包资源,进行后台加载 需要项目优化的pa you,这边走:Unity项目优化--Web版 一.前言 因为在下载Three.js,所以趁着这个时间写一下资源打包加载吧 小黑在刚开始学习Uni ...
 - ubuntu20.04 gnome桌面系统添加开机自启动GUI程序
			
在终端执行 gnome-session-properties,点击添加自己的脚本或执行文件,便可以在用户登录后自动执行.