二叉树的相关oj题目 — java实现

news2024/11/14 21:29:06

二叉树的所有相关oj题

  • 题目
    • 翻转二叉树
    • 判断两颗树是否相同
    • 对称二叉树
    • 判断一棵二叉树是否为另一颗的子树
    • 平衡二叉树
      • 方法1:
      • 方法2:(更快)
    • 二叉树的层序遍历
    • 二叉树的层序遍历II
    • 最近公共祖先
      • 方法1:
      • 方法2:
    • 二叉树的构建和遍历
    • 根据一棵树的前序遍历与中序遍历构造二叉树
      • 时间优化:
    • 根据一棵树的中序遍历与后序遍历构造二叉树
    • 根据二叉树创建字符串

题目

翻转二叉树

翻转二叉树

在这里插入图片描述

二叉树的问题一般都需要用到递归。

递归则需要我们将问题转换成子问题,并且需要一个结束条件

所以翻转整个二叉树有两个步骤:

  1. 先将 该树的左子树 和 右子树互换

在这里插入图片描述

  1. 递归翻转二叉树的左子树和右子树
    而结束条件是 一个树为一颗空树。

在这里插入图片描述
接下来只需要根据步骤来就可以了。

在这里插入图片描述

注意这里不是换 节点当中 的val,而是换整个节点。(也可以说是左子树和右子树互换)
在这里插入图片描述

最后翻转好了返回 root 即可。
在这里插入图片描述

最后这里也可以做个小优化,就是如果 这个树的左子树和右子树都是空树的话就可以直接 root,这样就不会进行 null 和 null 的无效交换

/**
 * 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 TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }

        if (root.left == null && root.right == null) {
            return root;
        }
        // 节点互换
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;

        // 递归
        invertTree(root.left);
        invertTree(root.right);

        return root;
    }
}


判断两颗树是否相同

判断两颗树是否相同

还是利用递归来做

判断两颗树是否相同需要下面几个条件:

  1. 判断两棵树的根是否相同
  2. 递归判断左子树和右子树是否相同

只有都相同了,才能说明两树相同,只要有一处不相同,那么就不相同。


如果两树都是空树,那么两树一定是相等的。

在这里插入图片描述

如果两数当中仅有一树为空,那么两树一定不相等
在这里插入图片描述
此时,如果没有进入这两个 if 说明此时两树一定都不为空。

这个时候需要判断两树的根的值是否相等,如果不等,那么就直接说明两树不相等
在这里插入图片描述
最终就只需要满足一个条件那么两树就相等了,左子树和右子树都相等。
在这里插入图片描述
也可以优化写成这种。
在这里插入图片描述
前面的一处也可以进行优化
在这里插入图片描述
因为一旦前面的if 没有进去,那么两个树一定不都为空

/**
 * 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 boolean isSameTree(TreeNode p, TreeNode q) {
        // 两树都为空,则一定相等
        if (p == null && q == null) {
            return true;
        }

        // 两树仅有一个树为空,一定不相等
        if (p == null && q != null
                || p != null && q == null) {
            return false;
        }

        // 两树的根节点的值不相同时,一定不相等
        if (p.val != q.val) {
            return false;
        }

        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);

    }
}


对称二叉树

判断是否是对称二叉树

这个题是没办法用一个函数去递归做的。

当一颗二叉树的左子树和右子树 互相是翻转二叉树,那么则可以说这棵树是对称二叉树

在这里插入图片描述
如果是空树,那么则是对称二叉树。

然后我们只需要返回 该树的左子树和右子树是不是翻转二叉树即可。

在这里插入图片描述
对于判断翻转二叉树函数来说,跟我们刚才的那道判断两树是否相等有点类似

只不过就是最后不一样,一个是左子树等于左子树,右子树等于右子树;
另一个左子树等于右子树,右子树等于左子树。

/**
 * 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 boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }

        return is(root.left, root.right);
    }

    //判断两颗树是否为翻转二叉树
    public boolean is(TreeNode p, TreeNode q) {
        //两树都为空,则是
        if (p == null && q == null) {
            return true;
        }
        //两树仅有一个为空树,则一定不是
        if (p == null || q == null) {
            return false;
        }

        //两树的根节点的值不相等,则一定不是
        if (p.val != q.val) {
            return false;
        }

        //只有p的左子树等于q的右子树
        //p的右子树等于左子树相等,说明为翻转二叉树,否则不是
        return is(p.left, q.right) && is(p.right, q.left);
        
    }
}

判断一棵二叉树是否为另一颗的子树

判断一颗二叉树是否为另一颗的子树

思路:

还是需要用到递归的思路。

当一棵树的与另一棵树相等或与其左子树或右子树相等时,就可以说,这棵树是另一颗树的子树。

首先我们要知道一个前提条件,当两棵树的任意一棵树如果为空树,那么就不是子树了。

在这里插入图片描述
这个也是我们的递归的结束条件。

这个题目要用到两棵树是否相等的函数,刚才我们已经写过了,所以直接拿来用。

在这里插入图片描述
然后我们只需要判断是不是满足下列要求当中的一个即可:

  1. 要么两树相等
  2. 要么左子树与另一棵树相等
  3. 要么右子树与另一棵树相等

在这里插入图片描述

/**
 * 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 boolean isSubtree(TreeNode p, TreeNode q) {
        if (p == null || q == null) {
            return false;
        }
    
        return isSameTree(p, q) || isSubtree(p.left, q) || isSubtree(p.right, q);
    }


    public boolean isSameTree(TreeNode p, TreeNode q) {
//1.先判断结构是否是一样的
        if(p != null && q == null || p == null && q != null) {
            return false;
        }
//上述if语句 如果没有执行,意味着两个引用 同时为空 或者同时不为空
        if(p == null && q == null) {
            return true;
        }
//都不为空 判断值是否一样
        if(p.val != q.val) {
            return false;
        }
//都不为空且值一样
        return isSameTree(p.left,q.left) &&  isSameTree(p.right,q.right);
    }
}



平衡二叉树

判断平衡二叉树

平衡二叉树是指的是所有节点的左子树和右子树的深度差不超过1.

方法1:

暴力获取每个节点的左子树和右子树的深度差。

在这里插入图片描述
注意每次需要特判 root是否为null,同时也是递归的结束条件

在这里插入图片描述
尽量不要函数套在函数里面,因为如果该函数得到的变量用到多次,那么就会重复进入函数,浪费时间,而且getHeight函数还是一个递归的函数

接着只需要写getHeight函数

一个树的高度等于,左子树的高度和右子树的高度的最大值 + 1

所以很好写

在这里插入图片描述


方法2:(更快)

方法1的时间复杂度有点高,遍历的每个节点都需要递归求该树的高度。

方法2思路:

在获取两颗子树的高度时顺便检查是否满足平衡二叉树

规定了如果返回的高度是-1则不满足条件,满足则返回该树的高度

判断左子树和右子树是否满足平衡二叉树,有一颗不满足,则直接不满足,两子树若都满足平衡二叉树,则判断两颗子树的深度差。

在这里插入图片描述


二叉树的层序遍历

二叉树的层序遍历

在这里插入图片描述
在进行特判时,不能返回null,需要返回一个空集合

这里的ArrayList集合也可以换成其他任意 实现List接口的集合


层序遍历有一个通用的模版

在这里插入图片描述

只需要将这个模版稍作修改即可

在这里插入图片描述

对于该题目来说,需要将每一层的所有节点的值存到集合当中

正常模版是每次弹出一个元素,但该题目需要每次弹出一整层的节点(正常模版也可以每次弹出一整层,都是一样的)

在这里插入图片描述

最后返回 ans 集合即可


class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
 
        List<List<Integer>> res = new ArrayList<>();//实现List接口的集合都可以
        if (root == null) {
            return res;//需要返回空集合而不是null
        }

        Queue<TreeNode> queue = new LinkedList<>();//实现Queue接口的集合都可以
        queue.offer(root);//将根节点入队列

        while (!queue.isEmpty()){//栈不为空
            List<Integer> list = new ArrayList<>();
            int size = queue.size();//该层的节点数
            
            while (size > 0) {//
                TreeNode top = queue.poll();
                list.add(top.val);
                if (top.left != null) {
                    queue.offer(top.left);
                }
                if (top.right != null) {
                    queue.offer(top.right);
                }
                size--;//*
            }
            
            res.add(list);
        }

        return res;
    }
}


二叉树的层序遍历II

二叉树的层序遍历II

相较于自底向上的层序遍历,只需要每次将整层节点 头插到最终的 List集合即可

在这里插入图片描述

最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先

在这里插入图片描述

三个点代表可能存在某棵树,假设p 和 q 分别为所求公共祖先的两个节点,root为树的根节点

方法1:

思路是分情况后,利用递归解决

有下列几种情况

  1. 空树没有公共祖先

  2. 根节点为 p 或 q

在这里插入图片描述

假设根节点为 p节点时,共有三种情况,在左子树里、在右子树里或者在A 节点的上方(前提如果存在)

根节点为q节点 同理。

这种情况下,它们的最近的公共祖先就是 根节点 root

  1. 刚才的第2种情况已经考虑完所有关于根节点的情况,接下来的情况根节点不再跟p q有关,其中left 是左子树返回的节点,right同理
    在这里插入图片描述

代码如下:

 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) {//空树没有公共祖先
            return null;
        }
        if (root == p || root == q) {//先考虑根节点
            return root;
        }

        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);

        if (left == null) {
            return right;
        }

        if (right == null) {
            return left;
        }
        return root;
    }

方法2:

思路:

  1. 遍历所有节点,用哈希表存储 每个节点的父节点
  2. 从p节点往上遍历,把遍历的节点加到另一个哈希表里
  3. 此时向上遍历 q节点,如果 q节点在 哈希表当中存在,则该节点为最最近的公共祖先


本次需要用到的集合
在这里插入图片描述

第一步遍历我们可以用深度优先遍历(dfs),也可以想成子问题递归,由于有递归需要封装成一个函数

在这里插入图片描述

接着按照刚才的三个步骤即可

在这里插入图片描述
注意这里的while循环里 不是 q != root 和 p != root,而是 != null,如果是 != root,那么root不会放到hashSet集合里。

**当哈希表给一个不存在的值时会返回null,所以当放到 root的时候会返回null, 所以此时p == null会跳出循环


class Solution {
    Map<TreeNode, TreeNode> parent = new HashMap<>();//存储每个节点的父节点  
    Set<TreeNode> hashSet = new HashSet<>();//用于临时存储部分节点

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //1.将每个节点的父节点存储下来
        dfs(root);

        //2.将p节点的祖宗们放到另一个哈希表里
        while (p != null) {
            hashSet.add(p);
            p = parent.get(p);
        }

        //3.遍历q节点和他的祖宗们,出现的第一个重复的节点就是最近的公共祖先
        while (q != null) {
            if (hashSet.contains(q)) {
                return q;
            }
            q = parent.get(q);
        }

        //走到这里说明 q的祖宗们都不是 p 的祖宗们,所以没有公共祖先
        return null;
    }

    public void dfs(TreeNode root) {
        if (root == null) {//空树直接返回
            return;
        }

        if (root.left != null)  {
            parent.put(root.left, root);//root.left的父亲是root
            dfs(root.left);
        }

        if (root.right != null) {
            parent.put(root.right, root);//root.right的父亲是root
            dfs(root.right);
        }

    }
}

二叉树的构建和遍历

二叉树的构建


创建一个TreeNode类


主函数里只需要创建好树之后中序遍历即可
在这里插入图片描述
在这里插入图片描述

该题重点在于如何将先序遍历字符串变成一棵二叉树,就是createTree函数

大致思路:

  1. 需要一个下标 index 用于指向字符串中的字符
  2. 创建一个节点,节点的值为 字符串中 index下标的值
  3. 子问题递归,该节点的左子树和右子树则等于 index++时的函数

在这里插入图片描述


根据一棵树的前序遍历与中序遍历构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树

知识点:

  1. 前序遍历的遍历优先度是 根 > 左 > 右,本题中我们需要从头开始把前序遍历的数字按个当成根
  2. 在中序遍历中,遍历优先度是 左 > 根 > 右,一个节点的左边的节点,一定在他的左子树里,右边的节点同理在这里插入图片描述
    比如节点4的左边节点,那么就一定都在4节点的左子树里,右边的节点都在右子树里

大致思路:

  1. 需要一个下标变量指向中序遍历的数组,记为preindex
  2. 创建值为 preorder[preindex]的节点,作为整棵树的根节点
  3. 找到该 根节点在中序遍历序列的位置
  4. 递归处理

在这里插入图片描述

由于递归的时候需要给一个inorder数组的序列范围,所以需要另写一个函数

在这里插入图片描述

注意事项:
preindex 不放在函数的参数里,因为这样递归在归的时候,preindex就会还原,而正确情况应该是下标从0开始一直到数组inorder 的结尾下标

preindex需要放在外面当做成员变量,注意这里的preIndex 不要用 static 修饰,因为静态变量只要类被加载了,那么就会一直存在,所以第二个测试用例对象及以后的 preIndex的值 不等于0

先递归左子树,再递归右子树,因为前序遍历的优先度是 根 左 右。

在这里插入图片描述

时间优化:

find函数需要遍历完 下标 inst 到 ined,每次都需要遍历一遍非常耗时间,所以我们可以将中序遍历的值和下标的对应关系存起来

我们可以利用HashMap存储对应 关系

在这里插入图片描述

接下来只需要将 init 函数放在最初的函数中,并且把find 函数替换掉即可

在这里插入图片描述

在这里插入图片描述

public Map<Integer, Integer> relation = new HashMap<>();

    public void init(int[] inorder) {
        for (int i = 0; i < inorder.length; i++) {
            relation.put(inorder[i], i);
        }
    }

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        init();
        return bulidTreeChild(preorder, inorder, 0, inorder.length - 1);
    }


    public int preIndex = 0;//前序遍历中的即将作为根节点的下标,可以不赋值,默认是0  
    // 返回数组下标从 inst 到 ined 的中序遍历 所构成的二叉树
    public TreeNode bulidTreeChild(int[] preorder, int[] inorder, int inst, int ined) {
        if (inst > ined) {//递归的结束条件
            return null;
        }

        //创建根节点
        TreeNode root = new TreeNode(preorder[preIndex]);
        //rootIndex是根节点在中序遍历里的下标
        int rootIndex = relation.get(root.val);//也可以写preorder[preIndex]
        preIndex++;//用一个根节点后 下标++;

        //根节点的左子树和右子树 子递归实现
        root.left = bulidTreeChild(preorder, inorder, inst, rootIndex-1);
        root.right = bulidTreeChild(preorder, inorder, rootIndex+1, ined);

        return root;
    }

    //找对应节点的下标
    public int find(int[] inorder, int inst, int ined, int val) {
        for (int i = inst; i <= ined; i++) {
            if (inorder[i] == val) {
                return i;
            }
        }
        return -1;
    }

根据一棵树的中序遍历与后序遍历构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树

本题大致思路和刚才的前序中序遍历构造二叉树差不多

后序遍历的序列的最后一个值 是 整棵树的根节点

大致思路:

  1. 定义一个变量postIndex 指向 postorder数组的最后一个元素
  2. 创建一个值为postorder[postIndex]的节点作为根节点
  3. 找到该节点在中序遍历序列中的位置,postIndex–;
  4. 递归,并且是先递归右子树,再左子树,因为后序遍历的优先度是左右根,由于postindex是从大到小遍历的,所以右的优先度比左高,所以先递归左子树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


根据二叉树创建字符串

根据二叉树创建字符串

大致思路:

  1. 在所给函数中创建一个StringBuilder对象记为sb,另写一个需要递归的函数并且参数中含有该对象,最后返回调用该对象的toString的值即可
  2. 将根节点的值拼接到sb,利用递归将左子树和右子树进行拼接

在这里插入图片描述
在这里插入图片描述


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

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

相关文章

实操经验 | Apache 基金会顶级项目版本管理和发布流程

前言 前段时间&#xff0c;Apache SeaTunnel经过几个月的迭代和架构升级&#xff0c;终于迎来第一个正式2.3.0版本&#xff0c;我也有幸作为本次的Release Manager&#xff0c;体验了一把从0到1的Apache发版流程&#xff0c;不得不说Apache基金会在项目的版本管理这块有着完善…

从报名到领证:软考中级系统集成项目管理工程师考试全流程指南

本文共计11564字&#xff0c;预计阅读38分钟。包括七个篇章&#xff1a;报名、准考证打印、备考、考试、成绩查询、证书领取及常见问题。 一、报名篇 报名条件要求&#xff1a; 1.凡遵守中华人民共和国宪法和各项法律&#xff0c;恪守职业道德&#xff0c;具有一定计算机技术…

数字化转型的内容框架解析,附华为数字化转型内容框架及方法论

数字化转型的内容框架是一个系统性、多维度的体系&#xff0c;旨在通过数字技术的融入和应用&#xff0c;对传统业务、流程和模式进行重构、升级&#xff0c;以提升效率、创造更多价值。以下是对数字化转型内容框架的详细阐述&#xff1a; 一、总体要求 数字化转型的总体要求…

07:为电源和GND分配网络颜色

1.创建电源类和GND类 2为电源和GND分配颜色

Pyqt5高级技巧2:Tab顺序、伙伴快捷键、各类常用控件的事件(含基础Demo)

一、编辑Tab顺序 点击下面这个按钮后&#xff0c;按控件调整tab的顺序&#xff0c;设置好后&#xff0c;鼠标聚焦在输入框1中&#xff0c;按一下tab鼠标聚焦会跳到下一个输入框中 编辑tab结束后&#xff0c;按下面这个按钮重新返回页面布局 二、编辑伙伴 &#xff08;删除伙伴…

会声会影和剪映哪个好?会声会影和剪映对比详解,视频剪辑软件推荐

随着社交媒体和网络视频的发展&#xff0c;在线视频编辑工具也变得越来越受欢迎。在视频编辑软件中&#xff0c;会声会影和剪映都是非常受欢迎的选择。它们都具有用户友好的界面和强大的功能&#xff0c;可以满足不同用户的需求。那么&#xff0c;哪一个软件更好呢&#xff1f;…

【OpenCV】初步认识 OpenCV

文章目录 1. OpenCV 简介 1. OpenCV 简介 &#x1f427;OpenCV是应用广泛的开源图像处理库。OpenCV用C语言编写&#xff0c;它具有C、Java、Pyhthon等接口&#xff0c;并支持Windows、Linux、Android&#xff0c;OpenCV主要倾向于实时视觉应用领域。 OpenCV应用领域&#xff1…

华为云征文|部署内容管理系统 Joomla

华为云征文&#xff5c;部署内容管理系统 Joomla 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 应用场景1.3 核心竞争力 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Joomla3.1 Joomla 介绍3.2 Docker 环境搭建3.3 Joomla 部署3.4 Joom…

谈一谈JVM的GC(垃圾回收)

JVM&#xff08;Java Virtual Machine&#xff09;的GC&#xff08;Garbage Collection&#xff0c;垃圾回收&#xff09;是Java语言的一个重要特性&#xff0c;它负责自动管理内存&#xff0c;释放那些不再被使用的对象所占用的内存空间。以下是对JVM GC的详细介绍&#xff1a…

Nginx: 使用KeepAlived配置实现虚IP在多服务器节点漂移及Nginx高可用原理

使用KeepAlived配置实现虚IP在多服务器节点漂移 1 &#xff09;环境准备 2台 linux , 一主一备 节点1&#xff1a;192.168.184.30 CentOS 7 Master节点2&#xff1a;192.168.184.40 CentOS 7 BackupVIP 192.168.184.50 安装 KeepAlived, $ yum install keepalived 注意&#x…

前端源码解读:前端小白也能轻松理解的axios源码

作为前端开发的小伙伴&#xff0c;你肯定对 axios 这个超级好用的 HTTP 请求库不陌生吧&#xff1f;它不仅操作简单&#xff0c;功能还特别强大&#xff0c;难怪大家都爱用&#xff01;但你知道吗&#xff1f;axios 的魅力可不仅仅在于它的好用&#xff0c;真正让人佩服的是它源…

jmeter 响应乱码

Jmeter在做接口测试的时候的&#xff0c;如果接口响应的内容中有中文&#xff0c;jmeter的响应内容很可能显示乱码&#xff0c;为了规避这种出现乱码的问题&#xff0c;就要对jmeter的响应结果进行编码处理。 打开jmeter进行接口、压力、性能等测试&#xff0c;出现以下乱码问…

[Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解

目录 1.体育课测验(二)1.题目链接2.算法原理详解 && 代码实现 2.合唱队形1.题目链接2.算法原理详解 && 代码实现 3.宵暗的妖怪1.题目链接2.算法原理详解 && 代码实现 1.体育课测验(二) 1.题目链接 体育课测验(二) 2.算法原理详解 && 代码实现…

数据结构-队列的介绍及循环队列

1.队列的概念 在开始前&#xff0c;请牢记这句话&#xff1a;队列是一个先进先出的数据结构。 队列&#xff08;queue&#xff09;是限定在表的一端进行插入&#xff0c;表的另一端进行删除的数据结构&#xff0c;如同栈的学习&#xff0c;请联系前文所学链表&#xff0c;试想…

python 安装

下载 Download Python | Python.org 安装

jquery下载的例子如何应用到vue中

参考测试圈相亲平台开发流程&#xff08;4&#xff09;&#xff1a;选个漂亮的首页 (qq.com) 下载的文件夹解压到v_love项目的pubilc下的static文件夹内&#xff0c;这里放的都是我们的静态资源。 打开文件夹内的index.html&#xff0c;我们先确定下它是不是我们要的东西&…

产品经理的学习笔记(全集)-持续更新

1.前言 产品经理不是一个软件&#xff0c;也不是一个专业技能&#xff0c;是一个思维量变的过程&#xff1b;内容介绍&#xff1a;P1-产品经理基础认知&#xff1b;P2-从0-1搭建实战项目&#xff08;电商&#xff09; 2.产品经理基础 2.1产品经理定义 产品管理--产品的设计…

求职Leetcode题目(9)

1.通配符匹配 题解&#xff1a; 其中&#xff0c;横轴为string s&#xff0c;纵轴为pattern p 这个表第(m,n)个格子的意义是:【p从0位置到m位置】这一整段&#xff0c;是否能与【s从0位置到n位置】这一整段匹配 也就是说&#xff0c;如果表格的下面这一个位置储存的是T(True)…

SprinBoot+Vue学生选课小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

Ubuntu 24.04 VMware里面设置静态ip上网

1.VMware里面设置网络为桥接模式 2.Ubuntu里面检查网卡名称 [~] ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:…