栈的应用,力扣394.字符串解码力扣946.验证栈序列力扣429.N叉树的层序遍历力扣103.二叉树的锯齿形层序遍历

目录

力扣394.字符串解码

力扣946.验证栈序列

力扣429.N叉树的层序遍历

力扣103.二叉树的锯齿形层序遍历


力扣394.字符串解码

看见括号,由内而外,转向用栈解决。使用两个栈处理,一个用String,一个用Integer

遇到数字:提取数字放入到数字栈中

遇到'[':把后面的字符串提取出来,放入字符串栈中

遇到']':解析,然后放到字符串栈,栈顶的字符串后面,(因为,我们获取的是左括号里面的字符串,和数字,也就是我们知道是几个左括号里面的值,然后我们和前一个进行简单的拼接即可。

遇到单独的字符:提取出来这个字符,直接放在字符串栈顶的字符串后面。

class Solution {
 public static String decodeString(String s) {
    Stack<String>a=new Stack<>();
    Stack<Integer>b=new Stack<>();
    char[]ss=s.toCharArray();
    //最终的存储结果的字符串
        int i=0;
        while(i<ss.length){
            StringBuffer ret=new StringBuffer();
            int Mathret=0;
//3[a2[ce]] acece        ec
        //思路,存储[括号,直到遇上右括号,然后我们需要做什么呢? 我们出来的顺序是ecec,或许可以考虑再存储一次?
        // 左[上面的,如果是非空,我全给他排出来,再塞进去,再排出来?,
        //或者是否可以使用StringBuffer添加char,再来一个reverse是否更好呢。
            if(ss[i]>='0'&&ss[i]<='9') {
                while (ss[i] >= '0' && ss[i] <= '9') {
                    Mathret = Mathret * 10 + (ss[i] - '0');
                    i++;
                }
                b.add(Mathret);
            }
   else  if(ss[i]=='['){
            i++;
                while (i<ss.length&&ss[i] >= 'a' && ss[i] <= 'z') {
                    ret.append(ss[i]);
                    i++;
                }
                a.add(ret.toString());
        }
      else  if(ss[i]==']'){
          String tem=a.pop();
          StringBuffer p=new StringBuffer();
          int count=b.pop();
          while(count>0){
              p.append(tem);
              count--;
          }
          if(!a.isEmpty()){
              StringBuffer pc=new StringBuffer(a.pop());
              pc.append(p);
              a.add(pc.toString());
          }else{
              a.add("");
              StringBuffer pc=new StringBuffer(a.pop());
              pc.append(p);
              a.add(pc.toString());

          }
            i++;
        }//此时单独遇到字符情况
      else{
                while (i<ss.length&&ss[i] >= 'a' && ss[i] <= 'z') {
                    ret.append(ss[i]);
                    i++;
                }
                if(!a.isEmpty()){
                    StringBuffer pc=new StringBuffer(a.pop());
                    pc.append(ret);
                    a.add(pc.toString());
                }else{
                    a.add("");
                    StringBuffer pc=new StringBuffer(a.pop());
                    pc.append(ret);
                    a.add(pc.toString());
                }
            }

    }
    return a.pop();
}
}

力扣946.验证栈序列

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer>a=new Stack<>();
        //j表示pop的指针,i表示push的指针
        int j=0;
        //首先这个题考虑过程中,先考虑肯定是是否两个字符串长度不同。
        for(int i=0;i<popped.length;i++){
            a.add(pushed[i]);
            while(!a.isEmpty()&&j<pushed.length&&popped[j]==a.peek()){
                a.pop();
                j++;
            }
        }
        return a.size()==0;
    }
}

力扣429.N叉树的层序遍历

这里我遇到一个问题,就是我的ret不断添加的过程中,发现把ret2添加进去之后,ret2被我改变,但是ret也改变,我问了半天,没结果,然后我去问gpt得到了这个原因

在你的代码中,`ret2` 是一个 `List<Integer>` 类型的局部变量,用于存储当前层的所有节点值。当你将 `ret2` 添加到 `ret` 中时,实际上是将 `ret2` 的引用添加到了 `ret` 列表中。这意味着 `ret` 列表中的元素仍然指向同一个 `ret2` 对象。

因此,如果你在后续的循环中继续修改 `ret2`,那么 `ret` 列表中的对应元素也会受到影响,因为它们引用的是同一个对象。


        result.add(new ArrayList<>(levelValues));  // 创建一个新的列表对象
    }

    return result;
}

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
        public  List<List<Integer>> levelOrder(Node root) {
        Queue<Node>q=new LinkedList<>();
        List<List<Integer>>ret=new ArrayList<>();
        if(root==null)return ret;
        q.add(root);

        while(!q.isEmpty()){
            int sz=q.size();
            List<Integer> ret2 = new ArrayList<>();
            while(sz!=0) {
                Node  head = q.poll();
                //暂时存储节点
                 ret2.add(head.val);
                    for (int i = 0; i < head.children.size(); i++) {
                        if(head.children!=null){
                        q.add(head.children.get(i));
              }   
           }
            sz--;
        }      
                ret.add(new ArrayList<>(ret2));      
            }

        return ret;
    }
}

力扣103.二叉树的锯齿形层序遍历

这个就是判断适当时机给他来个逆转就好,不难

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>>ret=new ArrayList<>();
        if(root==null)return ret;
        int count=0;
        Queue<TreeNode>q=new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()){
        List<Integer> ret2 = new ArrayList<>();
        int sz=q.size();
        while(sz!=0){
        TreeNode t=q.poll();
        ret2.add(t.val);
        //注意我们思考一下,怎么出来才正确
        if(t.left!=null)q.add(t.left);
        if(t.right!=null)q.add(t.right);
            sz--;
        }

        if(count%2==1){
                 List<Integer> ret3 = new ArrayList<>();
                 for(int i=ret2.size()-1;i>=0;i--){
                    ret3.add(ret2.get(i));
                 }
           ret.add(new ArrayList<>(ret3));
        }else{
        ret.add(new ArrayList<>(ret2));}

        count++;
        }
        return ret;
    }
}

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

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

相关文章

pandas与open读取csv/txt文件速度比较

pandas与open读取csv/txt文件速度比较 由于在工作中经常需要读取txt或csv文件&#xff0c;使用pandas与open均可以读取并操作文件内容&#xff0c;但不知道那个速度更快一些&#xff0c;所以写了一个脚本去比较在文件大小不同的情况下读取数据的速度 测试结果: 大小pandas速度…

039_SettingsGroup_in_Matlab图形界面的设置选项

只要你知道你自己正在做什么&#xff0c;那么你怎么做都行。—— C.J. DateMatlab的界面与设置 Matlab的界面 Matlab的界面是GUI设计中非常值得讨论的一个议题。先来看&#xff0c;默认的Matlab界面。 这里的界面从上到下分为了四个部分&#xff0c;分别是&#xff1a; 工具…

Flink-Source的使用

Data Sources 是什么呢&#xff1f;就字面意思其实就可以知道&#xff1a;数据来源。 Flink 做为一款流式计算框架&#xff0c;它可用来做批处理&#xff0c;也可以用来做流处理&#xff0c;这个 Data Sources 就是数据的来源地。 flink在批/流处理中常见的source主要有两大类…

.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角

窗体透明&#xff0c; 将Form的属性Opacity&#xff0c;由默认的100% 调整到 80%(尽量别低于50%)&#xff0c;这个数字越小越透明&#xff01; 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&#xff0c;窗体出现在屏幕…

分布式系统稳定性建设-性能优化篇

分布式系统稳定性建设-性能优化篇 系统稳定性建设是系统工程的核心内容之一。以下是一些重要的方面: 架构设计: 采用模块化、松耦合的架构设计,以提高系统的可扩展性和可维护性。合理划分系统功能模块,降低单个模块的复杂度。定义清晰的接口和数据交换标准,确保各模块之间协调…

【bug】使用transformers训练二分类任务时,训练损失异常大

使用transformers训练二分类任务时&#xff0c;训练损失异常大 问题分析 问题 training_loss异常大&#xff0c;在二分类损失中&#xff0c;收敛在1~2附近&#xff0c;而eval_loss却正常&#xff08;小于0.5&#xff09; 分析 参考&#xff1a; Bug in gradient accumulation…

电容测试流程

一、外观检测 1. 目的&#xff1a;检验电容样品外观是否与规格书一致&#xff0c;制程工艺是否良好&#xff0c;确保部品的品质。 2. 仪器&#xff1a;放大镜 3. 测试说明&#xff1a; &#xff08;1&#xff09;样品上丝印与规格书中相符&#xff0c;丝印信息&#xff08;…

C++设计模式行为模式———中介者模式

文章目录 一、引言二、中介者模式三、总结 一、引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 中介者模式可以减少对象之间混乱无序的依赖关系&…

一篇保姆式centos/ubuntu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubuntu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

EasyAnimate:基于Transformer架构的高性能长视频生成方法

这里主要是对EasyAnimate的论文阅读记录&#xff0c;感兴趣的话可以参考一下&#xff0c;如果想要直接阅读原英文论文的话地址在这里&#xff0c;如下所示&#xff1a; 摘要 本文介绍了EasyAnimate&#xff0c;一种利用Transformer架构实现高性能视频生成的高级方法。我们将原…

李宏毅机器学习课程知识点摘要(6-13集)

pytorch简单的语法和结构 dataset就是数据集&#xff0c;dataloader就是分装好一堆一堆的 他们都是torch.utils.data里面常用的函数&#xff0c;已经封装好了 下面的步骤是把数据集读进来 这里是读进来之后&#xff0c;进行处理 声音信号&#xff0c;黑白照片&#xff0c;红…

gpt2的学习

现在学习下gpt2模型做摘要&#xff0c;我们都知道gpt2 是纯decoder&#xff0c;做摘要说话的效果较好。 把数据拆分 按照这个进行tokenizer 用这个tokenizer BertTokenizer.from_pretrained(‘bert-base-chinese’) 2w多词汇表 用交叉熵做lossf&#xff0c; 设好一些简单的…

网络安全设备

防火墙 防火墙是管理和控制网络流量的重要工具&#xff0c;防火墙适用于过滤流量的网络设备。防火墙根据一组定义的规则过滤流量。 静态数据包过滤防火墙 静态数据包过滤防火墙通过检查消息头中的数据来过滤流量。通常&#xff0c;规则涉及源、目标和端口号。静态数据包过滤防…

Python爬虫:深入探索1688关键词接口获取之道

在数字化经济的浪潮中&#xff0c;数据的价值愈发凸显&#xff0c;尤其是在电商领域。对于电商平台而言&#xff0c;关键词不仅是搜索流量的入口&#xff0c;也是洞察市场趋势、优化营销策略的重要工具。1688作为中国领先的B2B电商平台&#xff0c;其关键词接口的获取对于商家来…

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程&#xff0c;提供一些解决思路 需求背景 公司有一个IM项目&#xff0c;对外暴露了两个端口8081和8082&#xff0c;8081是springboot启动使用的端口&#xff0c;对外提供一些http接口…

全面监测Exchange邮件服务器的关键指标

在当今高度信息化的社会&#xff0c;Exchange邮件服务器已成为企业日常通信的重要组成部分。为了确保邮件服务器的稳定运行&#xff0c;及时发现潜在问题并采取相应的解决措施显得尤为重要。监控易作为一款专业的监控工具&#xff0c;为Exchange邮件服务器提供了全方位的监测功…

实用功能,觊觎(Edge)浏览器的内置截(长)图功能

Edge浏览器内置截图功能 近年来&#xff0c;Edge浏览器不断更新和完善&#xff0c;也提供了长截图功能。在Edge中&#xff0c;只需点击右上角的“...”&#xff0c;然后选择“网页捕获”->“捕获整页”&#xff0c;即可实现长截图。这一功能的简单易用&#xff0c;使其成为…

IDEA2023版本配置项目全局编码

IDEA默认的项目编码是UTF-8&#xff0c;有时候拿到别人的代码使用的编码是GBK&#xff0c;虽然可以在idea右下角进行修改&#xff0c;但是一个一个的修改太慢了。所以需要去进行该项目的编码全局配置。接下来直接讲步骤&#xff0c;以IDEA2023版本为例。 第一步 File>Sett…

【Spiffo】环境配置:VScode+Windows开发环境

摘要&#xff1a; 在Linux下直接开发有时候不习惯快捷键和操作逻辑&#xff0c;用Windows的话其插件和工具都更齐全、方便&#xff0c;所以配置一个Windows的开发环境能一定程度提升效率。 思路&#xff1a; 自己本地网络内远程连接自己的虚拟机&#xff08;假定用的是虚拟机…

计算机网络 实验六 组网实验

一、实验目的 通过构造不同的网络拓扑结构图并进行验证&#xff0c;理解分组转发、网络通信及路由选择的原理&#xff0c;理解交换机和路由器在子网划分中的不同作用。 二、实验原理 组网实验是指将多个计算机通过网络连接起来&#xff0c;实现数据的共享和通信。 组网需要考虑…