【专项刷题】— 栈

news2024/9/20 13:17:27

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

思路:

  1. 使用栈进行操作,每次入栈的时候和栈顶元素进行比对,如果相同的话就弹出栈顶元素
  2. 也可以用数组来模拟栈进行操作
  3. 代码:
    public String removeDuplicates(String s) {
            //转换成字符数组
            char[] ss = s.toCharArray();
            StringBuffer ret = new StringBuffer();
            for(char ch : ss){
                //当长度不为0且最后一个字符和要加入的字符相等的时候
                if(ret.length() > 0 && ret.charAt(ret.length()-1) == ch){
                    //删除
                    ret.deleteCharAt(ret.length() - 1);
                }else{
                    //否则添加
                    ret.append(ch);
                }
            }
            return ret.toString();
        }

 2、基本计算器 II - 力扣(LeetCode)

思路:

代码:

public int calculate(String ss) {
        char[] s = ss.toCharArray();
        Deque<Integer> st = new ArrayDeque<>();
        int n = s.length;
        char op = '+';
        int i = 0;
        while(i < n){
            //排除空格
            if(s[i] == ' '){
                i++;
            }else if(s[i] >= '0' && s[i] <= '9'){
                int tmp = 0;
                while(i < n && s[i] >= '0' && s[i] <= '9'){//先更新数值
                    tmp = tmp*10 + (s[i] - '0');
                    i++;
                }
                //根据当前的操作符进行入栈
                if(op == '+'){
                    st.push(tmp);
                }else if(op == '-'){
                    st.push(-tmp);
                }else if(op == '*'){
                    st.push(st.poll() * tmp);
                }else{
                    st.push(st.poll() / tmp);
                }
            }else{
                //更新操作符
                op = s[i];
                i++;
            }
        }
        //出栈相加
        int ret = 0;
        while(!st.isEmpty()){
            ret += st.poll();
        }
        return ret;
    }

3、字符串解码 - 力扣(LeetCode)

思路:

代码:

public String decodeString(String ss) {
        char[] s = ss.toCharArray();
        int n = s.length;
        Stack<StringBuffer> str = new Stack<>();
        str.push(new StringBuffer());//先放一个空串
        Stack<Integer> nums = new Stack<>();
        int i = 0;
        while(i < n){
            if(s[i] >= '0' && s[i] <= '9'){
                int tmp = 0;
                while(i < n && s[i] >= '0' && s[i] <= '9'){
                    tmp = tmp*10 + (s[i] - '0');
                    i++;
                }
                nums.push(tmp);
            }else if(s[i] == '['){
                //先跳过 [ ,提取后面的字符
                i++;
                StringBuffer tmp = new StringBuffer();
                while(i < n && s[i] >= 'a' && s[i] <= 'z'){
                    tmp.append(s[i]);
                    i++;
                }
                str.push(tmp);
            }else if(s[i] == ']'){
                //开始解析,
                StringBuffer tmp = str.pop();
                int k = nums.pop();
                while(k-- != 0){
                    str.peek().append(tmp);
                }
                i++;
            }else{
                //处理纯字符的情况,直接加到栈顶字符的后面
                StringBuffer tmp = new StringBuffer();
                while(i < n && s[i] >= 'a' && s[i] <= 'z'){
                    tmp.append(s[i]);
                    i++;
                }
                str.peek().append(tmp);
            }
        }
        return str.peek().toString();
    }

 4、验证栈序列 - 力扣(LeetCode)

思路:

public boolean validateStackSequences(int[] pushed, int[] popped) {
        int j = 0;
        Deque<Integer> s = new ArrayDeque<>();
        //遍入栈的数组
        for(int x : pushed){
            //先入栈
            s.push(x);
            //如果栈顶与出栈顺序的数组相等
            while(!s.isEmpty() && s.peek() == popped[j]){
                s.pop();
                j++;
            }
        }
        return j == pushed.length;
    }

数组模拟栈:

public boolean validateStackSequences(int[] pushed, int[] popped) {
        int index = 0;
        int[] tmp = new int[pushed.length];
        for(int i = 0, j = 0; i < pushed.length; i++){
            tmp[index++] = pushed[i];
            while(index > 0 && tmp[index - 1] == popped[j]){
                index--;
                j++;
            }
        }
        return index == 0;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于人工智能的交通标志识别系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 交通标志识别系统是自动驾驶和智能交通的重要组成部分&#xff0c;能够帮助车辆自动识别路边的交通标志并作出相应的决策。通过使用深…

C语言-数据结构 无向图普里姆Prim算法(邻接矩阵存储)

Prim算法使用了贪心的思想&#xff0c;在算法中使用了两个数组&#xff0c;这两个数组会非常巧妙的操作整个算法的灵魂过程 lowcost的功能&#xff1a; 1.帮助算法寻找到当前距离已完成的最小生成树集合的最小的边长&#xff08;找到新边&#xff09; 2.在整个过程中记录新结…

分拣机介绍及解决方案细节

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件是关于交叉带式分拣机的介绍及解…

openSSL 如何降版本

文章目录 前言openSSL 如何降版本1. 卸载2. 安装新的openssl版本3. 验证 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&…

RT-Thread 使用HTTP固件下载方式进行OTA远程升级

参考资料:RT-T官网资料如下链接所示 STM32通用Bootloader (rt-thread.org) 1.app程序env配置过程 参考上述资料中"制作 app 固件"章节&#xff0c;分区大小根据自己设备而定&#xff0c;以下是我以407VET6为例设置的fal分区 notes:上述分区是由片内flash(on-chip)…

机械革命imini Pro820迷你主机评测和拆解,8845H小主机使用政府补贴仅需两千三

机械革命imini Pro820迷你主机评测和拆解&#xff0c;8845H小主机使用政府补贴仅需两千三。 最近上线了家电补贴相关的活动&#xff0c;最高可以补贴20%&#xff0c;然后就看到了这款mini主机感觉很划算就下单了&#xff0c;用来替换我旧的N5095小主机&#xff0c;当服务器用。…

电子技术基础

目录 二极管 二极管的概念二极管的整流 二极管的防反接 二极管的钳位稳压二极管 三极管 NPN型三极管PNP型三极管三极管的三种状态三极管三个极之间电流的关系 放大电路 三极管共射极放大电路分压式偏置电路静态工作点多级放大功率放大电路 运算放大器 同相比例放大器反相…

旅行商问题 | Matlab基于混合粒子群算法GA-PSO的旅行商问题TSP

目录 效果一览基本介绍建模步骤程序设计参考资料 效果一览 基本介绍 混合粒子群算法GA-PSO是一种结合了遗传算法&#xff08;Genetic Algorithm, GA&#xff09;和粒子群优化算法&#xff08;Particle Swarm Optimization, PSO&#xff09;的优化算法。在解决旅行商问题&#…

「Python数据分析」Pandas进阶,使用groupby分组聚合数据(三)

​在实际数据分析和处理过程中&#xff0c;我们可能需要灵活对分组数据进行聚合操作。这个时候&#xff0c;我们就需要用到用户自定义函数&#xff08;User-Defined Functions&#xff0c;UDFs&#xff09;。 使用用户自定义函数进行聚合 使用用户自定义函数聚合时的性能&…

联想泄露显示本月推出更便宜的Copilot Plus电脑

联想似乎准备推出新的更实惠的 Copilot Plus 电脑。可靠的爆料者Evan Blass发布了一份来自联想的新闻稿&#xff0c;详细介绍了将在本周晚些时候的IFA展会上宣布的各种Copilot Plus电脑&#xff0c;其中包括两款采用尚未公布的8核高通骁龙X Plus芯片的电脑。 这些新的高通芯片…

Qt 创建一个json数组对象写入文档并从文档读出q

void createJsonArray() { // 创建一个JSON数组 QJsonArray jsonArray; // 创建一些JSON对象并添加到数组中 for (int i 0; i < 3; i) { QJsonObject jsonObject; jsonObject["key" QString::number(i)] "value" QStri…

原点安全荣获“AutoSec Awards 安全之星”优秀汽车数据安全合规方案奖

9月3日&#xff0c;「AutoSec 2024第八届中国汽车网络安全周暨第五届智能汽车数据安全展」在上海盛大开幕。本届大会由谈思实验室和谈思汽车主办、上海市车联网协会联合主办&#xff0c;以汽车“网络数据安全、软件安全、功能安全”为主题&#xff0c;汇聚了国内外的技术专家、…

Meta关闭Spark AR平台:未来规划与影响分析

Meta宣布将关闭其移动AR创作平台Spark AR&#xff0c;这一消息在业界引起了广泛关注。尽管Snap和TikTok在AR滤镜领域取得了巨大成功&#xff0c;但Meta却选择了另一条发展道路。本文将探讨这一决策背后的可能原因及其对未来的影响。 关闭Spark AR平台的背后 硬件为主&#xff…

PyTorch 创建数据集

图片数据和标签数据准备 1.本文所用图片数据在同级文件夹中 ,文件路径为train/’ 2.标签数据在同级文件&#xff0c;文件路径为train.csv 3。将标签数据提取 train_csvpd.read_csv(train.csv)创建继承类 第一步&#xff0c;首先创建数据类对象 此时可以想象为单个数据单元的…

【PyTorch】基础环境如何打开

前期安装可以基于这个视频&#xff0c;本文是为了给自己存档如何打开pycharm和jupyter notebookPyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】_哔哩哔哩_bilibili Pycharm 配置 新建项目的时候选择解释器pytorch-gpu即可。 Jupyte…

【C++ 第二十二章】C++的类型转换

1.C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不一致时&#xff0c;就需要发生类型转化&#xff0c;C语言中总共有两种形式的类型转换&#xff1a;隐式类型转换和…

CDA数据分析一级考试备考攻略

一、了解考试内容和结构 CDA一级考试主要涉及的内容包括&#xff1a;数据分析概述与职业操守、数据结构、数据库基础与数据模型、数据可视化分析与报表制作、Power BI应用、业务数据分析与报告编写等。 CDA Level Ⅰ 认证考试大纲:https://www.cdaglobal.com/certification.h…

一文还原时序数据库 IoTDB 在 TPCx-IoT 的测试全流程!

在云服务硬件环境下&#xff0c;IoTDB 写入、查询、利用资源能力均表现出色&#xff01; 之前&#xff0c;我们为大家介绍了基于 IoTDB 的企业级产品 TimechoDB&#xff0c;在 TPCx-IoT 基准测试中打破世界纪录&#xff0c;取得的双指标第一成绩&#xff0c;和选择 TPCx-IoT 的…

【Python机器学习】核心数、进程、线程、超线程、L1、L2、L3级缓存

如何知道自己电脑的CPU是几核的,打开任务管理器(同时按下:Esc键、SHIFT键、CTRL键) 然后,点击任务管理器左上角的性能选项,观察右下角中的内核:后面的数字,就是你CPU的核心数,下图中我的是16个核心的。 需要注意的是,下面的逻辑处理器:32 表示支持 32 线程(即超线…

【爬虫软件】批量采集短视频博主的主页作品

用python开发的DY爬虫采集软件&#xff0c;可自动按博主抓取其已发布视频数据。 软件界面&#xff1a; 采集结果: 日志记录&#xff1a; 软件说明&#xff1a; 演示视频&#xff1a; https://www.bilibili.com/video/BV1Kb42187qf 讲解文章&#xff1a; https://www.bi…