代码随想录 Day-11

力扣题目 20 有效的括号

class Solution {
    public boolean isValid(String s) {
        Deque<Character> deque = new LinkedList<>();

        //如果长度为奇数,那么一定不对
        if((s.length() % 2) != 0){ return false; }

        for(int i = 0 ; i < s.length() ; i++){
            char ch = s.charAt(i);

            if(ch == '('){
                deque.push(')');
            }else if( ch == '{'){
                deque.push('}');
            }else if( ch == '['){
                deque.push(']');
            }
            //这时出现的可能是右括号,队列为空和判断栈里有没有匹配的
            else if( deque.isEmpty()  ||  deque.peek() != ch){
                return false;
            }else{
                deque.pop();
            }

        }

        return deque.isEmpty();
    }
}


力扣题目 1047 删除字符串中的所有相邻重复项

class Solution {
    public String removeDuplicates(String s) {
        int length = s.length();
        //Deque<Character> deque = new LinkedList<>();
        //ArrayDeque会比LinkedList在除了删除元素这一点外会快一点
        ArrayDeque<Character> deque = new ArrayDeque<>();

        char ch ;
        for(int i = 0; i < length ; i++){
            ch = s.charAt(i);
            if( deque.isEmpty() || ch != deque.peek() ){
                deque.push(ch);
            }else{
                deque.pop();
                //i--;
            }
        }

        String str = "";
        while(!deque.isEmpty()){
            str = deque.pop() + str;
        }

        return str;

    }
}

这里注意先判断为不为空先,不然会报错

先   isEmpty()  然后再   peek()

回想一下,类似这样重复的是否也可以用双指针实现?

Of Course!那么怎么做?直接删除吗?那要怎么删除呢?用肯定是用快慢指针,不是左右指针。那么快慢指针怎么走呢?

当快指针与慢指针相同的时候,可以将快指针的值直接覆盖慢指针的值,然后快指针继续往后走,慢指针后退一个;不相同时候直接往后两个同时往后走


力扣题目 150 逆波兰表达式求值

(栈适合做相邻字符的消除操作)

class Solution {
    public int evalRPN(String[] tokens) {
        Deque<Integer> stack = new LinkedList();
        for(String s : tokens){
            if("+".equals(s)){
                stack.push(stack.pop() + stack.pop());
            }else if("-".equals(s)){
                //注意减数与被减数的位置
                stack.push(-stack.pop() + stack.pop());
            }else if("*".equals(s)){
                stack.push( stack.pop() * stack.pop());
            }else if("/".equals(s)){
                //这里也需要注意除数与被除数的位置
                //不像减数那样可以加一个负号,所以需要设两个临时值
                int temp1 = stack.pop();    //除数
                int temp2 = stack.pop();    //被除数

                stack.push(temp2 / temp1);
            }else{
                //这里注意储存值得类型,s是字符串,而栈是整型
                stack.push(Integer.valueOf(s));
            }
        }

        return stack.pop();

    }
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值