首页 > 其他分享 >[刷题记录Day11]Leetcode

[刷题记录Day11]Leetcode

时间:2023-08-25 23:35:38浏览次数:51  
标签:op1 op2 pop Leetcode item Day11 push stack 刷题

No.1

题目

有效的括号

思路

  • 奇数个符号一定不符合
  • 分析括号不匹配的可能性
  • 第一种情况,字符串里左方向的括号多余了 ,所以不匹配
    ![[brackets0.png]]
  • 第二种情况,括号没有多余,但是 括号的类型没有匹配上
    ![[brackets1.png]]
  • 第三种情况,字符串里右方向的括号多余了,所以不匹配
    ![[brackets2.png]]

代码

public boolean isValid(String s) {  
    Stack<Character> stack = new Stack<>();  
    if (s.length() % 2 != 0)  
        return false;  
    for (int i = 0; i < s.length(); i++) {  
        char item = s.charAt(i);  
        if (item == '(')  
            stack.push(')');  
        else if (item == '[')  
            stack.push(']');  
        else if (item == '{')  
            stack.push('}');  
        // 遍历的过程中栈已经清空了,说明右括号的部分多余了  
        // 栈顶元素和当前元素不一致,说明不合法  
        else if (stack.empty() || stack.peek() != item)  
            return false;  
        // 只剩下栈顶元素和当前元素相等的情况  
        else  
            stack.pop();  
    }  
  
    return stack.empty();  
}

No.2

题目

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

思路

  • 遍历字符串,用栈
  • 碰到和栈顶元素相同的,pop
  • 遍历时的几种情况
    • 栈为空-入栈
    • 栈非空&栈顶元素不同-入栈
    • 栈非空&栈顶元素相同-出栈
  • 最后把栈POP空,拼字符串,然后反转

代码

public String removeDuplicates(String s) {  
    Stack<Character> stack = new Stack<>();  
    StringBuilder sb = new StringBuilder();  
  
    for (int i = 0; i < s.length(); i++) {  
        char item = s.charAt(i);  
        if (stack.empty())  
            stack.push(item);  
        else if (!stack.empty() && item != stack.peek())  
            stack.push(item);  
        else if (!stack.empty() && item == stack.peek())  
            stack.pop();  
    }  
  
    Stack<Character> tempS = new Stack<>();  
    while (!stack.empty())  
        tempS.push(stack.pop());  
    while (!tempS.empty())  
        sb.append(tempS.pop());  
  
    return sb.toString();  
}

No.3

题目

逆波兰表达式求值

思路

  • 注意提取操作数的顺序,先pop的是左操作数,后pop的是右操作数

代码

public int evalRPN(String[] tokens) {  
    Stack<Integer> stack = new Stack<>(); // 操作数栈  
  
    for (int i = 0; i < tokens.length; i++) {  
        String item = tokens[i];  
        int op1, op2;  
  
        switch (item) {  
            case "+" -> {  
                op1 = stack.pop();  
                op2 = stack.pop();  
                stack.push(op1 + op2);  
            }  
            case "-" -> {  
                op2 = stack.pop();  
                op1 = stack.pop();  
                stack.push(op1 - op2);  
            }  
            case "*" -> {  
                op1 = stack.pop();  
                op2 = stack.pop();  
                stack.push(op1 * op2);  
            }  
            case "/" -> {  
                op2 = stack.pop();  
                op1 = stack.pop();  
                stack.push(op1 / op2);  
            }  
            default -> {  // 只剩下数字  
                int tmp = Integer.parseInt(item);  
                stack.push(tmp);  
            }  
        }  
    }  
  
    return stack.pop();  
}

标签:op1,op2,pop,Leetcode,item,Day11,push,stack,刷题
From: https://www.cnblogs.com/tomatoQt/p/17658182.html

相关文章

  • [刷题记录Day10]Leetcode
    No.1题目用栈实现队列思路模拟一个入栈一个出栈代码classMyQueue{privateStack<Integer>stackIn;privateStack<Integer>stackOut;publicMyQueue(){stackIn=newStack<>();stackOut=newStack<>();......
  • [刷题记录Day13]Leetcode
    No.1题目滑动窗口最大值思路编写单调队列类讲解代码classMonoQue{Deque<Integer>deque=newLinkedList<>();//弹出元素时,比较当前要弹出的值是否等于队列出口的值,相等则弹出//同时判断队列此时是否为空voidpoll(intval){......
  • [刷题记录Day8]Leetcode
    No.1题目反转字符串思路双指针,从头尾向中间遍历代码publicvoidreverseString(char[]s){ chartemp; intleft=0,right=s.length-1; while(left<right){ temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; }}No.2......
  • [刷题记录Day9]Leetcode
    建议跳过No.1题目找出字符串中第一个匹配项的下标思路KMP代码No.2题目重复的子字符串思路KMP代码......
  • [刷题记录Day6]Leetcode哈希表
    No.1题目有效的字母异位词思路每个字符频率都相同,于是把字母表映射到长度为26的数组上代码publicbooleanisAnagram(Strings,Stringt){intlenS=s.length(),lenT=t.length();if(lenT!=lenS)returnfalse;int[]alphabet=newint[26]......
  • [刷题记录Day7]Leetcode哈希表
    No.1题目四数相加II思路很妙的办法:有四个数组A、B、C、D,用hashMap记录【A、B中数字之和】+【这些和出现的次数】,再遍历C、D中数字组合,寻找【0-C、D中数字之和】在hashMap中出现的次数,并累加本质上,这是把4个数组简化成了2个数组代码publicintfourSumCount(int[]nums1,......
  • 我害怕你,刷题的人——献给即将开始的高中
    小考、中考,期中考、期末考,单元考、月考,你从各种考试中走来。选择题、填空题、解答题;作用力的问题、赛跑的问题、溶液的问题;你认不认得这个字,你会写吗;他活了多少岁,他做了几件好事、几件坏事;函数、三角形还有一个圆,达·芬奇画画都在用的那些原理;run还是running,加to还是......
  • VSCode使用JavaScript刷LeetCode配置教程(亲试可以!)
    账号秘密都对,但是缺登录不成功的问题诀窍可能是:在属性设置中把LeetCode版本改成cn。点击LeetCode配置,修改Endpoint配置项,改成leetcode-cn,再次尝试登陆即可。  大家可移步原博文:https://blog.csdn.net/qq_37263248/article/details/124304402......
  • leetcode1260
    这是一道模拟题刚开始准备纯模拟,而后在题解看到一维压缩,才发现其实是将矩阵按行展开后进行k次右移操作。转换成一维后,难点就在转换坐标:行号=idx/列数;列号=idx%列数; ......
  • leetcode236求最近公共祖先
    递归TreeNode*dfs(TreeNode*root,TreeNode*p,TreeNode*q){if(!root)returnroot;//当发现这个节点已经是叶节点时,要告诉上层if(root==p||root==q)returnroot;//当发现是p节点或者q时也要告诉上层TreeNode*left=dfs(root->left,p,q);//左子树是否有p或者q......