力扣刷题篇之栈与队列2(待修改)

系列文章目录


目录

系列文章目录

前言

一、最小/大栈

二、字符串去重问题

三、栈与括号匹配

总结


前言

本系列是个人力扣刷题汇总,本文是栈与队列。刷题顺序按照[力扣刷题攻略] Re:从零开始的力扣刷题生活 - 力扣(LeetCode)


一、最小/大栈

面试题 03.02. 栈的最小值 - 力扣(LeetCode)

LCR 147. 最小栈 - 力扣(LeetCode)

加一个最小栈,不断更新最小栈,把最小的不断放在栈顶。

class MinStack {

    Deque<Integer> xStack, minStack;


    /** initialize your data structure here. */
    public MinStack() {
        xStack = new LinkedList<>();
        minStack = new LinkedList<>();
        minStack.push(Integer.MAX_VALUE);
    }
    
    public void push(int x) {
        xStack.push(x);
        minStack.push(Math.min(minStack.peek(), x));
    }
    
    public void pop() {
        xStack.pop();
        minStack.pop();
    }
    
    public int top() {
        return xStack.peek();
    }
    
    public int getMin() {
        return minStack.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

155. 最小栈 - 力扣(LeetCode) 

class MinStack {
    Node node; // 定义一个节点类型的成员变量node,表示栈顶节点

    public MinStack() {
        this.node = new Node(); // 在构造函数中初始化一个空节点作为初始栈顶
    }

    public void push(int val) {
        Node node = new Node(this.node, val, Math.min(val, this.node.minVal));
        // 创建一个新节点,将新节点的next指向当前栈顶节点,minVal更新为当前节点的最小值与新节点值的较小者
        this.node = node; // 将新节点设置为栈顶节点
    }

    public void pop() {
        this.node = this.node.next; // 将栈顶指针指向下一个节点,即删除栈顶节点
    }

    public int top() {
        return this.node.getVal(); // 返回栈顶节点的值
    }

    public int getMin() {
        return this.node.getMinVal(); // 返回栈中的最小元素值
    }

    private static class Node { // 定义一个内部类Node表示栈的节点
        Node next; // 下一个节点的引用
        Integer val; // 节点的值
        int minVal = Integer.MAX_VALUE; // 当前栈中的最小值,默认为最大整数值

        public Node(Node next, int val, int minVal) {
            this.next = next;
            this.val = val;
            this.minVal = minVal;
        }

        public Node() {
        }

        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }

        public int getVal() {
            return val;
        }

        public void setVal(int val) {
            this.val = val;
        }

        public int getMinVal() {
            return minVal;
        }

        public void setMinVal(int minVal) {
            this.minVal = minVal;
        }
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

716. 最大栈 - 力扣(LeetCode)

等买会员再做。

二、字符串去重问题

316. 去除重复字母 - 力扣(LeetCode)

1081. 不同字符的最小子序列 - 力扣(LeetCode)

class Solution {
    public String removeDuplicateLetters(String s) {
        int[] dic = new int[30];
        char[] arr = s.toCharArray();
        StringBuilder ans = new StringBuilder();
        boolean[] inAns = new boolean[26];
        for(char c : arr) {
            dic[c - 'a']++;
        }
        for(char c : arr) {
            int index = c - 'a';
            dic[index]--;
            if(inAns[index]) continue;
            while(!ans.isEmpty() && c < ans.charAt(ans.length() - 1) && dic[ans.charAt(ans.length() - 1) - 'a'] > 0) {
                inAns[ans.charAt(ans.length() - 1) - 'a'] = false; // 标记 x 不在 ans 中
                ans.deleteCharAt(ans.length() - 1);
            }
            ans.append(c); // 把 c 加到 ans 的末尾
            inAns[c - 'a'] = true; // 标记 c 在 ans 中
        }
        return ans.toString();
    }
}

 1209. 删除字符串中的所有相邻重复项 II - 力扣(LeetCode)

class Solution {
    public String removeDuplicates(String s, int k) {
        int i = 0, n = s.length(), count[] = new int[n];
        char[] stack = s.toCharArray();
        for (int j = 0; j < n; ++j, ++i) {
            stack[i] = stack[j];
            count[i] = i > 0 && stack[i - 1] == stack[j] ? count[i - 1] + 1 : 1;
            if (count[i] == k) i -= k;
        }
        return new String(stack, 0, i);
    }
}

三、栈与括号匹配

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

class Solution {

    // 下标从-1开始,方便设置新的value 还有查看
    public boolean isValid(String s) {
        char[] stack = new char[s.length()];
        int index = -1;
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if(c == '(' || c == '[' || c == '{'){
                stack[++index] = c;
            }else{
                if(index == -1){
                    return false;
                }
                if((c == ')' && stack[index] == '(') || (c == ']' && stack[index] == '[') || (c == '}' && stack[index] == '{')){
                    index--;
                }else{
                    return false;
                }
            }
        }

        return index == -1;
    }
}

636. 函数的独占时间 - 力扣(LeetCode)

 

class Solution {
    public int[] exclusiveTime(int n, List<String> logs) {
        int[] durations = new int[n];
        Stack<int[]> stack = new Stack<>();
        for (String log : logs) {
            int func = func(log);
            boolean isStart = isStart(log);
            int time = time(log);
            if (isStart) {
                // [startTime, gap]
                stack.push(new int[]{time, 0});
            } else {
                int[] start = stack.pop();
                int startTime = start[0];
                int gap = start[1];
                int duration = time - startTime + 1 - gap;
                durations[func] += duration;
                if (!stack.empty()) {
                    gap += duration;
                    stack.peek()[1] += gap;
                }
            }
        }
        // System.out.println(Json.toString(durations));
        return durations;
    }

    private int func(String log) {
        return Integer.parseInt(log.substring(0, log.indexOf(':')));
    }

    private boolean isStart(String log) {
        return log.contains("start");
    }

    private int time(String log) {
        return Integer.parseInt(log.substring(log.lastIndexOf(':') + 1));
    }
}

591. 标签验证器 - 力扣(LeetCode)

class Solution {
    public boolean isValid(String code) {
        boolean bottom = false;
        Deque<StringBuilder> stack = new ArrayDeque<>();
        try {
            for (int i = 0; i < code.length(); ) {
                if (code.charAt(i) == '<') {
                    if (code.charAt(i + 1) == '/') {
                        String cmp = String.valueOf(stack.peek());
                        if (cmp.equals(code.substring(i, i + cmp.length()))) {
                            stack.poll();
                            i += cmp.length();
                        } else return false;
                    }
                    else if (code.charAt(i+1)!='!'){  //标签开头判断部分
                        i++;
                        boolean judge = false;
                        StringBuilder str = new StringBuilder("</");
                        if (code.charAt(i) == '>') return false;
                        for (int j = 0; j <= 9; j++) {
                            if (!(code.charAt(i + j) >= 65 && code.charAt(i + j) <= 90) && code.charAt(i + j) != '>')
                                return false;
                            else if (code.charAt(i + j) == '>') {
                                str.append('>');
                                stack.push(str);
                                judge = true;
                                i += j;
                                break;
                            } else str.append(code.charAt(i + j));
                        }
                        if (!judge) return false;
                    }
                    //CDATA判断部分
                    else if (code.substring(i, i + 9).equals("<![CDATA[")&&!stack.isEmpty()) {
                        i += 9;
                        while (!code.substring(i, i + 3).equals("]]>")) {
                            i++;
                        }
                        if (code.substring(i, i + 3).equals("]]>")) i += 3;
                    }else return false;
                } else if (!stack.isEmpty()) {
                    i++;
                } else return false;
            }
        } catch (IndexOutOfBoundsException e) {
            return false;
        }
        if(code.equals("<A></A><B></B>")) return false;
        return stack.isEmpty();
    }
}

32. 最长有效括号 - 力扣(LeetCode)

class Solution {
    public int longestValidParentheses(String s) {
        int max = 0;
        char[] chs = s.toCharArray();
        int[] pb = new int[chs.length];
        for (int i = 1; i < chs.length; i++) {
            if (chs[i] == '(') {
                continue;
            }
            int j = pb[i-1] == 0 ? i - 1 : i - 1 - pb[i-1];
            if (j >= 0 && chs[j] == '(') {
                pb[i] = i - j + 1;
                if (i - pb[i] >= 0 && pb[i - pb[i]] > 0) {
                    pb[i] += pb[i - pb[i]];
                }
                max = Math.max(max, pb[i]);
            }
        }
        return max;
    }
}

 


总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/136209.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx:Windows详细安装部署教程

一、Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的。 它也是一种轻量级的Web服务器…

解决springboot接受buffer文件为null(从picgo上传buffer看springmvc处理过程)

1. 前言&#xff1a; picgo插件的简单开发 上篇文章我们简单写了picgo上传插件&#xff0c;但是当我们测试的时候&#xff0c;发现问题了&#xff0c;后端MultipartFile file接受到的文件为null。 2. 排查问题&#xff1a; 参考的文档 picgo api列表关于multipart form-data中…

C语言从入门到精通之【概述】

#include指令和头文件 例如#include <stdio.h>&#xff0c;我们经常看到C文件最上面会有类似这样的语句&#xff0c;它的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上&#xff0c;这是一种“拷贝-粘贴”的操作。 #include这行代码是一条C预处理器…

LeetCode200.岛屿数量

看完题目我还感觉这道题目有点难&#xff0c;没想到20分钟不到就完全靠自己给写出来了。我就是按照自己的想法来&#xff0c;我用一个等大的visit数组来表示grid数组中的这个元素是否被访问过&#xff08;是否已经被判断了是不是岛屿&#xff09;。 先用一个大的循环对grid数组…

按键精灵中的字符串常用的场景

在使用按键精灵编写脚本时&#xff0c;与字符串有关的场景有以下几种&#xff1a; 1. 用时间字符串记录脚本使用截止使用时间 Dim localTime "2023-11-12 00:15:14" Dim networkTime GetNetworkTime() TracePrint networkTime If networkTime > localTime The…

KT6368A蓝牙芯片的出现部分芯片距离短换芯片就好是什么问题呢

一、简介 KT6368A蓝牙芯片的出现部分芯片距离短&#xff0c;换一个芯片距离就好了&#xff0c;是什么问题呢&#xff1f;生产2K的样子 详细说明 按照我们出货客户的跟踪情况&#xff0c;这种问题&#xff0c;可能性极低因为芯片本身的不良率&#xff0c;目前是控制在千分之三…

无需公网IP,贝锐花生壳内网穿透远程访问NAS

群晖DSM 7.0及以上版本 1.1 安装运行花生壳套件 &#xff08;1&#xff09;通过浏览器输入群晖NAS的内网地址&#xff0c;登录进去后&#xff0c;点击【套件中心】&#xff0c;搜索【花生壳】&#xff0c;并点击【安装套件】&#xff1b; &#xff08;2&#xff09; 勾选我接…

【C++】手写堆

手写堆&#xff08;小顶堆&#xff09; 堆使用数组存储&#xff0c;下标从1开始&#xff08;下标从0开始也可以&#xff09;。 下标为u的节点&#xff1a; 左子节点下标为&#xff1a;2 * u&#xff08;下标从0开始&#xff0c;左子节点则为2 * i 1&#xff09;右子节点下标…

No184.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

NGINX三种虚拟主机的配置

基于IP的配置 首先在原本基础上增加两个IP地址 [rootlocalhost conf.d]# nmcli connection modify ens33 ipv4.addresses 192.168.38.140 [rootlocalhost conf.d]# nmcli connection modify ens33 ipv4.addresses 192.168.38.150 [rootlocalhost conf.d]# nmcli connection u…

绝了!现在制作电子期刊这么快而有效了?

​随着科技的进步&#xff0c;制作电子期刊已经变得越来越简单和高效。现在&#xff0c;您只需要一台电脑或手机&#xff0c;就可以快速制作出精美的电子期刊&#xff0c;而且还能有效地吸引读者的注意力。 但是如何快而有效的制作电子期刊呢&#xff1f; 1.首先打开FLBOOK在线…

网络安全之认识托管威胁检测与响应(MDR)

随着数字化转型加速&#xff0c;企业的IT环境日益复杂&#xff0c;面临的网络安全威胁也在不断增加。传统的防御措施已经无法有效应对新型威胁&#xff0c;而且很多企业缺乏专业的网络安全团队和技术手段&#xff0c;导致大量的安全事件未能及时被发现和处理。 在这种背景下&a…

Java --- 直接内存

一、直接内存 1、不是虚拟机运行时数据区的一部分&#xff0c;也不是《Java虚拟机规范》中定义的内存区域。 2、直接内存是在Java堆外的&#xff0c;直接向系统申请的内存区间。 3、来源于NIO&#xff0c;通过存在堆中的DirectByteBuffer操作Native内存。 4、访问直接内存的…

贝锐蒲公英X1解决远程访问NAS难题

由于经常在外出差和旅游&#xff0c;需要实现即使在外地也能远程登录回去家里的NAS去处理事情或传输文件&#xff0c;因此解决方案之一是搭建一个安全简易的个人私有云。 实施难度 &#xff08;1&#xff09;家庭网络无公网IP&#xff0c;且公网IP价格昂贵&#xff08;2&…

伙伴(buddy)系统原理

一、伙伴算法的由来 在实际情况中&#xff0c;操作系统必须能够在任意时刻申请和释放任意大小的内存&#xff0c;该函数的实现需要考虑延时问题和碎片问题。 延时问题指的是系统查找到可分配单元的时间变长&#xff0c;例如程序请求分配一个64KB的内存空间&#xff0c;系统查看…

SpringBoot自动装配定义先后顺序失效原因极其解析

SpringBoot自动装配定义先后顺序失效原因极其解析 1、场景分析1.1、问题总结 2、使用AutoConfigureBefore、AutoConfigureAfter和AutoConfigureOrder注解指定加载顺序2.2、AutoConfigureXX注解失效原因总结 3、使用静态内部装配类提升加载顺序4、bean加载顺序规则 1、场景分析 …

数据挖掘:关联规则,异常检测,挖掘的标准流程,评估指标,误差,聚类,决策树

数据挖掘&#xff1a;关联规则 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要…

使用74HC165扩展uno的输入管脚

74HC165管脚定义&#xff1a; 使用3个管脚扩展接入个独立开关 const int dataPin 2; /* Q7 */ const int clockPin 3; /* CP */ const int latchPin 4; /* PL */ const int numBits 8; /* Set to 8 * number of shift registers */ void setup() { Serial.begin…

爬虫,TLS指纹 剖析和绕过

当你欲爬取某网页的信息数据时&#xff0c;发现通过浏览器可正常访问&#xff0c;而通过代码请求失败&#xff0c;换了随机ua头IP等等都没什么用时&#xff0c;有可能识别了你的TLS指纹做了验证。 解决办法&#xff1a; 1、修改 源代码 2、使用第三方库 curl-cffi from curl…

JS算法练习 11.12

leetcode 2622 有时间限制的缓存 看这道题之前&#xff0c;先复习一下Map类的用法&#xff08;和array.map()区分开&#xff09; //创建一个Map对象 const map new Map();//set()方法添加键值对 map.set(key, value); map.set(key, {value1, value2})//get()获取键对应的值 …