当前位置: 首页 > article >正文

栈 算法专题

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

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

class Solution {
    public String removeDuplicates(String s) {
        StringBuffer ret = new StringBuffer();
        char[] ss = s.toCharArray();
        for (int i = 0; i < ss.length; i++) {
            int len = ret.length();
            if (len > 0 && ss[i] == ret.charAt(len - 1)) {
                ret.deleteCharAt(len - 1);
            } else {
                ret.append(ss[i]);
            }
        }
        return ret.toString();
    }
}

二. 比较含退格的字符串

比较含退格的字符串

class Solution {
    public boolean backspaceCompare(String s, String t) {
        return changeStr(s).equals(changeStr(t));
    }

    public String changeStr(String s){
        StringBuffer ret = new StringBuffer();
        char[] ss = s.toCharArray();
        for(char x : ss){
            int len = ret.length();
            if(x == '#'){
                if(len > 0){
                ret.deleteCharAt(len - 1);
                }
            }else{
                ret.append(x);
            }
        }
        return ret.toString();
    }
}

三. 基本计算器II

基本计算器II

属于表达式求值的问题, 解法都是用栈模拟计算过程

class Solution {
    public int calculate(String s) {
        Deque<Integer> ret = new ArrayDeque<>();
        char[] ss = s.toCharArray();
        int n = ss.length;
        int i = 0;
        char op = '+';
        while(i < n){
            //判断空格
            if(ss[i] == ' '){
                i++;
            }else if(ss[i] >= '0' && ss[i] <= '9'){//如果是数字
                int tmp = 0;
                while(i < n && ss[i] >= '0' && ss[i] <= '9'){//把数字提出来
                    tmp = tmp * 10 + (ss[i]-'0');
                    i++;
                }
                //如果+-就入栈, 如果*/ 就先与栈顶元素计算后入栈
                if(op == '+') ret.push(tmp);
                if(op == '-') ret.push(-tmp);
                if(op == '*') ret.push(ret.poll() * tmp);
                if(op == '/') ret.push(ret.poll() / tmp);
            }else{//如果是符号
                op = ss[i];
                i++;
            }
        }
        //将栈中的元素全部相加
        int sum = 0;
        while(!ret.isEmpty()){
            sum += ret.poll();
        }
        return sum;
    }
}

四. 字符串解码

字符串解码

class Solution {
    public String decodeString(String s) {
        //一个存放字符串, 一个存放数字
        Stack<StringBuffer> st = new Stack<>();
        Stack<Integer> nums = new Stack<>();
        //细节: 先放入一个空串
        st.push(new StringBuffer());
        int i = 0;
        char[] ss = s.toCharArray();
        int n = ss.length;
        while(i < n){
            //如果是数字, 就把这个数提出来, 放到数字栈
            if(ss[i] >= '0' && ss[i] <= '9'){
                int tmp = 0;
                while(i < n && ss[i] >= '0' && ss[i] <= '9'){
                    tmp = tmp * 10 + (ss[i] - '0');
                    i++;
                }
                nums.push(tmp);
            }else if(ss[i] == '['){//如果是[, 就把后面的字符串提出来, 放到字符串栈
                i++;
                StringBuffer tmp = new StringBuffer();
                while(i < n && ss[i] >= 'a' && ss[i] <= 'z'){
                    tmp.append(ss[i]);
                    i++;
                }
                st.push(tmp);
            }else if(ss[i] ==']'){//如果是], 就进行解析, 取两个栈的栈顶元素, 添加到字符串栈栈顶的后面
                StringBuffer str = st.pop();
                int num = nums.pop();
                while(num-- != 0){
                    st.peek().append(str);
                }
                i++;
            }else{//如果是不在[]中的字符串, 就直接添加到字符串栈栈顶的后面
                 StringBuffer tmp = new StringBuffer();
                while(i < n && ss[i] >= 'a' && ss[i] <= 'z'){
                    tmp.append(ss[i]);
                    i++;
                }
                    st.peek().append(tmp);
            }
        }
        return st.pop().toString();
    }
}

五. 验证栈序列

验证栈序列

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> st = new Stack<>();
        int j = 0;
        for(int i = 0; i < pushed.length; i++){
            st.push(pushed[i]);
            while(!st.isEmpty() && popped[j] == st.peek()){
                st.pop();
                j++;
            }
        }
        if(st.isEmpty()){
            return true;
        }
        return false;
    }
}

http://www.kler.cn/a/380983.html

相关文章:

  • git 多账号配置
  • 如何无缝更换WordPress主题:关键步骤详解
  • ffplay 实现视频流中音频的延迟
  • 关于git命令
  • kafka里的consumer 是推还是拉?
  • RabbitMQ交换机类型
  • SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
  • 深入探讨 ESPnet AIShell 项目:ASR 脚本 asr.sh 的实现与解析(一)之脚本前564行,定义各种配置项、函数和条件逻辑
  • Oracle 11g DataGuard GAP处理
  • uniapp实现【时间戳转换为日期格式(年-月-日 时-分-秒)】
  • 10款音视频转文字工具体验记!!!
  • docker构建次数过多导致硬盘爆满,清除
  • mysql上课总结(2)(DCL的所有操作总结、命令行快速启动/关闭mysql服务)
  • 【让中国再次伟大】腾讯开源大语言模型Hunyuan-large,支持高达256K文本序列
  • 基于qt vs下的视频播放
  • [Python学习日记-61] 什么是类与对象?类与对象是什么关系呢?我们该如何定义和使用类与对象呢?
  • 使用 Python 构建代理池并测试其有效性
  • JavaEE初阶----网络原理之TCP篇(一)
  • 10款PDF转Word软件工具的使用感受及其亮点!!!
  • LeetCode:20. 有效的括号(java)
  • 计算机网络网络层笔记
  • golang 实现比特币内核:椭圆曲线有限域的代码实现
  • #渗透测试#SRC漏洞挖掘# 操作系统-windows系统bat病毒
  • 有线电视 1.27.5 | 完全免费的电视直播应用,频道丰富,画质清晰
  • 成功解决WSL2上的Ubuntu22.04执行sudo apt-get update指令报错问题
  • 基于A*算法的无人车路径规划