代码随想录训练营第十一天 | Leetcode 20 有效的括号、Leetcode 1047 删除字符串中的所有相邻重复项、Leetcode 150 逆波兰表达式求值

 目录

Leetcode 20 有效的括号

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

Leetcode 150 逆波兰表达式求值


Leetcode 20 有效的括号

题目链接:Leetcode 有效的括号

文字讲解:代码随想录 有效的括号

视频讲解:b站视频

学习记录:

其实没有那么复杂,总共可以归结为3种情况:

  • 左括号多了
  • 右括号多了
  • 左右括号不匹配

处理的之后妙啊!先遇到左括号,在栈中放入对应的右括号,然后一一进行对比,如果匹配就弹出。到最后如果栈不为空,说明左括号多了;如果栈不够,说明右括号多了;如果不匹配,说明左右括号不匹配。

另外还可以考虑额外的剪枝操作,妙啊!如果字符串长度为奇数,直接排除!

编译器在 词法分析的过程中处理括号、花括号等这个符号的逻辑,是使用了栈这种数据结构。

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        char[] ch = s.toCharArray();
        if(ch.length%2==1){
            return false;
        }
        for(int i=0;i<ch.length;i++){
            if(ch[i]=='('){
                stack.push(')');
            }
            else if(ch[i]=='['){
                stack.push(']');
            }
            else if(ch[i]=='{'){
                stack.push('}');
            }
            else if(stack.isEmpty() || ch[i]!=stack.peek()){
                return false;
            }
            else{
                stack.pop();
            }
        }
        return stack.isEmpty();
    }
}

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

题目链接:Leetcode 删除字符串中的所有相邻重复项

文字讲解:代码随想录 删除字符串中的所有相邻重复项

视频讲解:b站视频

第一想法:

借助一个栈,从前往后遍历这个字符串,如果当前字符和栈里面的第一个字符内容相等,栈里面的内容就弹出,不同就入栈,最后栈里面剩下的就是无重复的内容,然后将其按顺序保存在一个数组里面,然后数组转成字符串输出。

class Solution {
    public String removeDuplicates(String s) {
        Stack<Character> stack = new Stack<>();
        char[] ch = s.toCharArray();
        stack.push(ch[0]);
        for(int i=1; i<ch.length; i++){
            if(!stack.isEmpty() && ch[i]==stack.peek()){
                stack.pop();
            }
            else{
                stack.push(ch[i]);
            }
        }
        char[] result = new char[stack.size()];
        for(int i=stack.size()-1;i>=0;i--){
            result[i] = stack.pop();
        }
        return new String(result);


    }
}

学习记录:

和我的第一想法的过程一样,开心!

此处再附上一个双指针的操作

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 逆波兰表达式求值

题目链接:Leetcode 逆波兰表达式求值

文字讲解:代码随想录 逆波兰表达式求值

视频讲解:b站视频

第一想法:

        遇到数字先存数到栈里面,然后遇到了符号之后,找到其对应操作要用到的数字,也就是当前栈顶的两个数字,先pop出来,要注意顺序,然后计算结果,将计算得到的结果push入栈,重复以上操作,直到栈为空。

        其中还涉及到了字符串转成数字的问题。

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for(int i=0; i<tokens.length; i++){
            if("+".equals(tokens[i])){
                int a=stack.pop();
                int b=stack.pop();
                stack.push(b+a);
            }
            else if("-".equals(tokens[i])){
                int a=stack.pop();
                int b=stack.pop();
                stack.push(b-a);
            }
            else if("*".equals(tokens[i])){
                int a=stack.pop();
                int b=stack.pop();
                stack.push(b*a);
            }
            else if("/".equals(tokens[i])){
                int a=stack.pop();
                int b=stack.pop();
                stack.push(b/a);
            }
            else{
                int temp = Integer.parseInt(tokens[i]);
                stack.push(temp);
            }
        }
        return stack.pop();
    }
}

学习记录:

 和我的想法一摸一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值