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

news2024/11/25 4:10:12

目录

力扣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;
    }
}

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

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

相关文章

Vue3移动端-点餐项目

目录 一、项目构建 1、使用了vite构建vue3项目&#xff0c;其中支持如下图 2、其余路由配置、axios封装、组件封装 都与 后台管理系统 方式一致 二、Vant组件引入 1、安装 &#xff08;vue3使用vant4&#xff09;Vant官方文档 2、全局引入main.ts/js 3、如果是基于 Vite 的…

分词器的概念(通俗易懂版)

什么是分词器&#xff1f;分词器&#xff08;Tokenizer&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一个关键组件&#xff0c;它的主要功能是将文本数据分解成更小的单元&#xff0c;这些单元可以是单词、子词&#xff08;subword&#xff09;、字符或其他有意义…

【JavaEE进阶】 JavaScript

本节⽬标 了解什么是JavaScript, 学习JavaScript的常⻅操作, 以及使⽤JQuery完成简单的⻚⾯元素操作. 一. 初识 JavaScript 1.JavaScript 是什么 JavaScript (简称 JS), 是⼀个脚本语⾔, 解释型或即时编译型的编程语⾔. 虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名&#xff0c;…

浮点数的表示—IEEE754标准

浮点数的表示—IEEE754标准 引言 我们知道&#xff0c;在计算机中&#xff0c;数字以0和1组成的二进制序列来表示。但是&#xff0c;对于非常大的数字以及非常接近0的数字&#xff0c;简单的存储方式往往会造成精度的丢失。 为了解决这个问题&#xff0c;提供更高效的浮点数…

uniapp vue2项目迁移vue3项目

uniapp vue2项目迁移vue3项目&#xff0c;必须适配的部分 一、main.js 创建应用实例 // 之前 - Vue 2 import Vue from vue import App from ./App Vue.config.productionTip false // vue3 不再需要 App.mpType app // vue3 不再需要 const app new Vue({ ...App }) …

计算机网络(14)ip地址超详解

先看图&#xff1a; 注意看第三列蓝色标注的点不会改变&#xff0c;A类地址第一个比特只会是0&#xff0c;B类是10&#xff0c;C类是110&#xff0c;D类是1110&#xff0c;E类是1111. IPv4地址根据其用途和网络规模的不同&#xff0c;分为五个主要类别&#xff08;A、B、C、D、…

Unity DOTS中的Entity

Unity DOTS中的Entity 在DOTS中entity往往只被看作一个ID&#xff0c;用来查找component&#xff0c;但实际上Unity为了有效地管理entity&#xff0c;在背后还做了一些其他的工作。首先是Entity类本身的定义&#xff0c;它的确跟一个ID差不多&#xff0c;只包含了两个int类型的…

SpringBoot实现单文件上传

一、在springBoot项目中的pom.xml添加依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 二、在资源目录下的static目录下中创建一个upload.html的表单文件…

CNN—LeNet:从0开始神经网络学习,实战MNIST和CIFAR10~

文章目录 前言一、CNN与LeNet介绍二、LeNet组成及其名词解释2.1 输入2.2 卷积层2.3池化层2.4 全连接层2.5 总结 三、MNIST实战3.1 构建神经网络3.2 数据处理3.3 &#xff08;模板&#xff09;设置优化器&#xff0c;损失函数&#xff0c;使用gpu(如果是N卡有cuda核心)&#xff…

PVE系统中风扇驱动安装——linux 硬件驱动安装(IT8613E为例)

本文提供全流程命令代码,IT8613E的Github下载地址,pve头文件官方下载地址 对网卡驱动感兴趣的可以看这篇文章 linux系统下 usb网卡的驱动安装_0bda:a192-CSDN博客文章浏览阅读1.5w次,点赞16次,收藏72次。本文介绍如何通过lsusb查找USB网卡vid:pid,使用google搜索驱动信息…

美国人工智能国家安全备忘录核心解读(下)

文章目录 三、美国国内和国际人工智能治理策略1.保证AI政策有效执行的协调措施2.推进AI治理格局的优势地位&#xff08;1&#xff09;对于美国盟友&#xff1a;试图向盟友保证其将从美国的战略中获益。&#xff08;2&#xff09;对于美国的战略竞争对手&#xff1a;介绍了超越竞…

工具学习_Docker

0. Docker 简介 Docker 是一个开源平台&#xff0c;旨在帮助开发者构建、运行和交付应用程序。它通过容器化技术将应用程序及其所有依赖项打包在一个标准化的单元&#xff08;即容器&#xff09;中&#xff0c;使得应用程序在任何环境中都能保持一致的运行效果。Docker 提供了…

红黑树模拟实现STL中的map与set

1.map 在C标准模板库(STL)中&#xff0c;std::map是一种非常实用且强大的容器&#xff0c;它提供了键值对的存储机制。这使得std::map成为处理具有唯一关键的关联数据的理想选择。 1.1 map的特性 1、键值对存储&#xff1a;std::map通过键值对的形式存储数据&#xff0c;其中…

【数据结构专栏】二叉搜索树(Binary Search Tree)的剖析?

文章目录 &#x1f9e8;前言1、二叉搜索树的基本概念&#xff1f;2、二叉搜索树的节点结构组成&#xff1f;3、二叉搜索树的插入操作&#xff1f;4、二叉搜索树的删除操作&#xff1f;5、二叉搜索树的遍历&#xff1f; 6、二叉搜索树的性能分析&#xff1f; &#x1f389;完整代…

FastApi学习第三天:两表联查

两表联查 在 FastAPI 中&#xff0c;使用 Tortoise ORM 查询两表联查&#xff08;通常是通过外键关系进行联接&#xff09;是非常简单的。可以使用 select_related 或 prefetch_related 来执行联表查询&#xff0c;它们类似于 Django ORM 的 select_related 和 prefetch_relate…

Redis原理及应用

Redis简介 Redis是开源的&#xff08;BSD许可&#xff09;&#xff0c;数据结构存储于内存中&#xff0c;被用来作为数据库&#xff0c;缓存和消息代理。它支持多种数据结构&#xff0c;例如&#xff1a;字符串&#xff08;string&#xff09;&#xff0c;哈希&#xff08;hash…

Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ UI部分暂时完结&#xff01;&#xff01;&#xff01; 本章节优化了UI中物品描述的显示效果&#xff0c;技能描述的显示效果 并且可以批…

oracle的静态注册和动态注册

oracle的静态注册和动态注册 静态注册&#xff1a; 静态注册 : 指将实例的相关信息手动告知 listener 侦 听 器 &#xff0c; 可以使用netmgr,netca,oem 以及直接 vi listener.ora 文件来实现静态注册&#xff0c;在动态注册不稳定时使用&#xff0c;特点是&#xff1a;稳定&…

社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动

摘要&#xff1a;本文围绕社交电商有望成为高校常态专业这一趋势展开深入探讨&#xff0c;剖析国家政策认可下其学科发展前景&#xff0c;着重阐述在专业建设进程中面临的师资短缺及实践教学难题。通过引入定制开发AI智能名片与21链动商城小程序&#xff0c;探究如何借助这些新…

数据指标与标签在数据分析中的关系与应用

导读&#xff1a;分享数据指标体系的文章很多&#xff0c;但讲数据标签的文章很少。实际上&#xff0c;标签和指标一样&#xff0c;是数据分析的左膀右臂&#xff0c;两者同样重要。实际上&#xff0c;很多人分析不深入&#xff0c;就是因为缺少对标签的应用。今天系统的讲解下…