代码随想录Day11

20.有效的括号

题目:20. 有效的括号 - 力扣(LeetCode)

思路:只要我逐个遍历,如果是' ( ',下一个就必须是' ) ',这样不就行了,但是这样想的话,好像又太简单了。或者是,我统计左边和右边的字符,因为有效的必然是偶数,然后左边的括号数量和右边的括号数量三种类型一定是一致的,我直接搞一个数组存一下不久行了,两个数组,一左一右,最后对比,或者是直接一个数组,先累加,再累减,最后数组元素应该全是0

第二个思路,快慢指针,一个指针留在原地,一个指针寻找另一半括号,找到之后两个指针做差,看差是否为偶数,也不行,( { [ ) } ]的情况就会漏掉

尝试
class Solution {
    public boolean isValid(String s) {
        int[] res = new int[3];
        if(s.length()%2!=0) return false;
        for(int i=0;i < s.length(); i++){
            if(s.charAt(i)='('){
                res[0]++;
            }
            if(s.charAt(i)='{'){
                res[1]++;
            }
            if(s.charAt(i)='['){
                res[2]++;
            }
        }
        for(int i=0;i < s.length(); i++){
            if(s.charAt(i)=')'){
                res[0]--;
            }
            if(s.charAt(i)='}'){
                res[1]--;
            }
            if(s.charAt(i)=']'){
                res[2]--;
            }
        }
        for(int i : res){
            if(i != 0){
                return false;
            }
        }
        return true;
    }
}
4/27 看完视频后
class Solution {
    public boolean isValid(String s) {
        Stack<Character> res = new Stack<>();
        if(s.length() % 2 != 0) return false;
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i)=='(') res.push(')');
            if(s.charAt(i)=='{') res.push('}');
            if(s.charAt(i)=='[') res.push(']');
            if(s.charAt(i)==')' || s.charAt(i)=='}' || s.charAt(i)==']'){
                if(!res.isEmpty() && s.charAt(i)==res.peek()){
                    res.pop();
                }else{
                    return false;
                }
            };
        }
        if(res.isEmpty()){
            return true;
        }
        return false;
    }
}
小结
  • 属于是思路完全错误
  • 可以用Deque来实现栈

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

题目:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

思路:可以用栈来判断当前字符,和上一个字符是否相同,难点在于,什么时候停下来,反复删除的话,岂不是要用递归,要么就搞一个计数器,只要遍历之后,一次都没有从栈内弹出元素,即此时不存在相邻重复项

第二个思路:从字符串尾部往前遍历,每个元素都推入栈中,每次推入就判断当前推入元素和栈顶元素是否相同,相同就弹出栈顶元素,不同就推入,最后把元素取出,append到StringBuilder里面

尝试

小结

思路没错,就是java基础的语法出错了

🍉要用LinkedList初始化Deque,【Deque<Character> res = new LinkedList<>();】

🍉初始化字符,✔【char ch;】 ❌【char ch = new Character();】

150.逆波兰表达式求值

题目:150. 逆波兰表达式求值 - 力扣(LeetCode)

思路:我记得操作系统内部的计算,好像就是用逆波兰的方式,要用到栈。

1. 定义两个栈,左栈(存储计算结果),右栈(存储数字和运算符)

2. 从尾部开始遍历,把所有内容存入到右栈

3. 逐个从右栈弹出元素,塞入到左栈,一旦右栈弹出运算符,就从左栈弹出两个元素,计算完之后再推入左栈,以此类推

尝试

class Solution {
    public int evalRPN(String[] tokens) {
        Deque<String> left = new LinkedList<>();
        Deque<String> right = new LinkedList<>();
        for(int i = tokens.length-1;i >=0; i-- ){
            right.push(tokens[i]);
        }
        while(!right.isEmpty()){
            String ch = right.pop();
            if(ch.isDigit()){
                left.push(ch);
            }else{
                int first = left.pop();
                int second = left.pop();
                if(ch == '*'){
                    left.push(first * second);
                }else if(ch == '/'){
                    left.push(first / second);
                }else if(ch == '+'){
                    left.push(first + second);
                }else{
                    left.push(first - second);
                }
            }
        }
        return Integer.parseInt(left.pop());
    }
}
小结
  • 一个栈就可以实现,遇到运算符就计算,不是运算符就推入
  • 🍉Integer.valueOf(s),可以把字符串转换为数字
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值