第427场周赛: 转换数组、用点构造面积最大的矩形 Ⅰ、长度可被 K 整除的子数组的最大元素和、用点构造面积最大的矩形 Ⅱ

Q1、转换数组

1、题目描述

给你一个整数数组 nums,它表示一个循环数组。请你遵循以下规则创建一个大小 相同 的新数组 result

对于每个下标 i(其中 0 <= i < nums.length),独立执行以下操作:

  • 如果 nums[i] > 0:从下标 i 开始,向 移动 nums[i] 步,在循环数组中落脚的下标对应的值赋给 result[i]
  • 如果 nums[i] < 0:从下标 i 开始,向 移动 abs(nums[i]) 步,在循环数组中落脚的下标对应的值赋给 result[i]
  • 如果 nums[i] == 0:将 nums[i] 的值赋给 result[i]

返回新数组 result

**注意:**由于 nums 是循环数组,向右移动超过最后一个元素时将回到开头,向左移动超过第一个元素时将回到末尾。

2、解题思路

  1. 循环数组的处理
    • 循环数组的关键是取模运算。当数组的大小为 n 时,对于任何一个下标 i 和步数 k,可以通过 (i + k) % n 来获得向右移动 k 步后的目标下标,或者通过 (i - k + n) % n 来获得向左移动 k 步后的目标下标。
  2. 问题分解
    • 对于每个下标 i ,根据 nums[i] 的值来决定如何计算 result[i]:
      • 如果 nums[i] == 0,直接将 result[i] 设置为 nums[i]
      • 如果 nums[i] > 0,我们需要向右移动 nums[i] 步,计算目标下标并取值。
      • 如果 nums[i] < 0,我们需要向左移动 abs(nums[i]) 步,同样计算目标下标并取值。
  3. 细节处理
    • 通过对数组长度 n 取模,确保即使移动的步数超过数组长度,也能正确处理循环效果。

3、代码实现

class Solution {
public:
    vector<int> constructTransformedArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> result(n);

        for (int i = 0; i < n; ++i) {
            if (nums[i] == 0) {
                result[i] = nums[i];
            } else {
                int targetIndex = (i + nums[i] % n + n) % n;
                result[i] = nums[targetIndex];
            }
        }

        return result;
    }
};

4、复杂度分析

时间复杂度O(n),其中 n 是输入数组 nums 的大小。我们只遍历了一次 nums 数组,进行常数时间的操作,因此时间复杂度是线性的。

空间复杂度O(n),我们创建了一个新的数组 result 来存储变换后的结果,空间复杂度为 O(n)


Q2、用点构造面积最大的矩形 Ⅰ

1、题目描述

给你一个数组 points,其中 points[i] = [xi, yi] 表示无限平面上一点的坐标。

你的任务是找出满足以下条件的矩形可能的 最大 面积:

  • 矩形的四个顶点必须是数组中的 四个 点。
  • 矩形的内部或边界上 不能 包含任何其他点。
  • 矩形的边与坐标轴 平行

返回可以获得的 最大面积 ,如果无法形成这样的矩形,则返回 -1。

2、解题思路

  1. 矩形的基本条件
    • 矩形的四个顶点必须在给定的点集 points 中。
    • 矩形的边必须与坐标轴平行。
    • 矩形的内部或边界不能有其他点。
  2. 矩形的顶点特性
    • 假设有四个顶点 (x1, y1), (x2, y2), (x3, y3), (x4, y4),其中 (x1, y1)(x2, y2) 是对角线的两个顶点。根据矩形的性质,其他两个顶点可以通过交换 x 或 y 坐标来确定,具体是 (x1, y2)(x2, y1)
    • 因此,对于任意两点 (x1, y1)(x2, y2),我们可以计算出另外两个点 (x1, y2)(x2, y1),然后检查这两个点是否在 points 中。如果这两个点都存在,那么这四个点就能形成一个矩形。
  3. 验证矩形的合法性
    • 矩形的边界必须没有其他点。我们需要确保除了矩形的四个顶点外,矩形内的所有点都不包含在 points 中。为了提高效率,我们可以使用哈希集 unordered_set 来存储点坐标,这样可以在常数时间内查询某个点是否存在。
  4. 计算矩形面积
    • 对于两个对角点 (x1, y1)(x2, y2),矩形的面积可以通过 abs(x2 - x1) * abs(y2 - y1) 来计算。

解题步骤

  1. 预处理数据
    • 使用哈希集合 unordered_set 存储所有点的坐标,方便后续查询。
  2. 双重遍历所有点对
    • 对于任意两个点 (x1, y1)(x2, y2),如果 x1 != x2y1 != y2,则可以构成一个矩形的两个对角点。计算另外两个顶点 (x1, y2)(x2, y1),并检查它们是否存在于点集合中。
  3. 验证矩形
    • 对于找到的矩形,检查矩形的内部和边界是否只包含矩形的四个顶点,不包含其他点。如果符合条件,则计算矩形的面积。
  4. 更新最大矩形面积
    • 在遍历过程中,始终记录当前找到的最大矩形面积。
  5. 返回结果
    • 如果找到了符合条件的矩形,则返回最大面积;否则返回 -1

3、代码实现

class Solution {
public:
    int maxRectangleArea(vector<vector<int>>& points) {
        int n = points.size();
        if (n < 4) {
            return -1;  // 如果点数少于4个, 无法形成矩形
        }

        // 哈希集合用于快速查询点是否存在
        unordered_set<string> pointSet;
        for (const auto& p : points) {
            pointSet.insert(encode(p[0], p[1]));  // 将每个点编码存入哈希集
        }

        int maxArea = -1;  // 最大矩形面积, 初始为-1, 表示未找到矩形

        // 双重循环,枚举所有点对
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                int x1 = points[i][0], y1 = points[i][1];
                int x2 = points[j][0], y2 = points[j][1];

                // 如果两个点在水平或垂直方向上重合,跳过
                if (x1 != x2 && y1 != y2) {
                    string p3 = encode(x1, y2);  // 第三个点
                    string p4 = encode(x2, y1);  // 第四个点

                    // 检查是否有这两个点
                    if (pointSet.count(p3) && pointSet.count(p4)) {
                        // 检查矩形的内部和边界是否为空
                        if (isValidRectangle(x1, y1, x2, y2, pointSet)) {
                            // 计算矩形面积
                            int area = abs(x2 - x1) * abs(y2 - y1);
                            maxArea = max(maxArea, area);  // 更新最大面积
                        }
                    }
                }
            }
        }

        return maxArea;  // 返回最大矩形面积, 如果没有矩形, 返回-1
    }

    // 将坐标编码成字符串, 便于存入哈希集
    string encode(int x, int y) {
        return to_string(x) + "," + to_string(y);
    }

    // 检查矩形的内部和边界是否为空
    bool isValidRectangle(int x1, int y1, int x2, int y2, const unordered_set<string>& pointSet) {
        int minX = min(x1, x2), maxX = max(x1, x2);
        int minY = min(y1, y2), maxY = max(y1, y2);

        // 遍历矩形内部和边界的所有点
        for (int x = minX; x <= maxX; ++x) {
            for (int y = minY; y <= maxY; ++y) {
                string p = encode(x, y);
                if (pointSet.count(p)) {
                    // 如果不是四个顶点之一,则返回 false
                    if (!((x == x1 && y == y1) || (x == x1 && y == y2) ||
                          (x == x2 && y == y1) || (x == x2 && y == y2))) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
};

4、时间复杂度分析

  • 哈希集合插入:我们将所有点存储到哈希集合中,时间复杂度是 O(n),其中 n 是点的数量。
  • 双重循环:我们枚举所有点对,每次枚举的时间复杂度是 O(n^2)
  • 验证矩形:对于每一对点,我们需要检查矩形的每个点,这需要 O(n) 的时间。

因此,总的时间复杂度为 O(n^3),适合点数较少的情况。


Q3、长度可被 K 整除的子数组的最大元素和

1、题目描述

给你一个整数数组 nums 和一个整数 k

返回 nums 中一个 非空子数组最大 和,要求该子数组的长度可以 k 整除

子数组 是数组中一个连续的、非空的元素序列。

2、解题思路

  • 前缀和(Prefix Sum): 前缀和是一种常见的技巧,它可以在 O(1) 时间复杂度内计算任意区间的和。我们构建一个 prefixSum 数组,其中 prefixSum[i] 表示从数组 nums[0]nums[i-1] 的和。这样,任意子数组的和可以通过 prefixSum 数组的差值计算得到。

  • 余数技巧: 为了确保子数组的长度是 k 的倍数,我们可以利用前缀和的余数。

  • 最小前缀和维护: 为了高效地计算符合条件的子数组和,我们维护一个大小为 k 的数组 minPrefixSum,用来记录每个余数下最小的前缀和。对于每个位置 j,计算当前前缀和 prefixSum[j] 与对应余数的最小前缀和的差值,得到符合条件的子数组和。

  • 最大和更新: 每次遍历时,计算当前前缀和与最小前缀和的差值,更新最大和。

具体实现步骤

  1. 计算前缀和
    • 初始化一个大小为 n + 1 的数组 prefixSum,其中 prefixSum[i] 存储 nums[0]nums[i-1] 的和。此时,prefixSum[0] = 0
  2. 初始化最小前缀和数组
    • 创建一个大小为 k 的数组 minPrefixSum,用来记录每个余数下的最小前缀和。初始化时,将所有值设置为一个非常大的数,LLONG_MAX / 2,这样可以避免溢出。
  3. 遍历前缀和数组
    • 遍历 prefixSum 数组,对于每个 prefixSum[j],计算它的余数 j % k
    • 更新最大和 maxSubarraySum 为当前前缀和与最小前缀和的差值(如果差值大于当前的最大和)。
    • 更新最小前缀和数组 minPrefixSum,保持每个余数下最小的前缀和。
  4. 返回结果
    • 返回计算得到的最大和。

3、代码实现

class Solution {
public:
    long long maxSubarraySum(vector<int>& nums, int k) {
        int n = nums.size();
        vector<long long> prefixSum(n + 1, 0); // 前缀和数组

        // 计算前缀和数组
        for (int i = 1; i <= n; ++i) {
            prefixSum[i] = prefixSum[i - 1] + nums[i - 1];
        }

        // 初始化最小前缀和数组
        vector<long long> minPrefixSum(k, LLONG_MAX / 2);
        long long ret = LLONG_MIN;

        // 遍历所有的前缀和,更新最小前缀和数组,并计算可能的最大子数组和
        for (int i = 0; i <= n; ++i) {
            // 当前前缀和的余数
            int remainder = i % k;
            ret = max(ret, prefixSum[i] - minPrefixSum[remainder]);
            minPrefixSum[remainder] = min(minPrefixSum[remainder], prefixSum[i]);
        }

        return ret;
    }
};
QQ_1733645195207

4、复杂度

时间复杂度

  • 计算前缀和数组的时间复杂度是 O(n)
  • 遍历前缀和数组并更新最小前缀和数组的时间复杂度也是 O(n)
  • 因此,总时间复杂度是 O(n),其中 n 是数组 nums 的长度。

空间复杂度

  • 我们使用了两个数组 prefixSumminPrefixSum,它们的大小分别为 n + 1k
  • 因此,空间复杂度是 O(n + k)

Q4、用点构造面积最大的矩形 Ⅱ

1、题目描述

在无限平面上有 n 个点。给定两个整数数组 xCoordyCoord,其中 (xCoord[i], yCoord[i]) 表示第 i 个点的坐标。

你的任务是找出满足以下条件的矩形可能的 最大 面积:

  • 矩形的四个顶点必须是数组中的 四个 点。
  • 矩形的内部或边界上 不能 包含任何其他点。
  • 矩形的边与坐标轴 平行

返回可以获得的 最大面积 ,如果无法形成这样的矩形,则返回 -1。

2、解题思路

1、数据预处理

我们需要记录点集的各种关系,用于后续矩形的验证:

  • 按列分组:使用 x_map 记录同一列的所有点的纵坐标。
  • 按行分组:使用 y_map 记录同一行的所有点的横坐标。
  • 计算正下方的点:对于每个点,记录它正下方的点,用 below 存储。
  • 计算正左方的点:对于每个点,记录它正左方的点,用 left 存储。
2、矩形验证

假设矩形的右上角为 (x2, y2),左下角为 (x1, y1),需要验证以下条件:

  1. 矩形左下角 (x1, y1) 存在,且在 (x2, y2) 的左边。
  2. 矩形左上角 (x1, y2) 存在,且在 (x2, y2) 的左边。
  3. 矩形右下角 (x2, y1) 存在,且在 (x2, y2) 的下边。

如果以上条件都满足,就将矩形的顶点记录下来,并存储矩形的面积。

3、离散化

为了高效处理点的范围查询,我们需要对坐标进行离散化:

  • 按行和列分别对坐标排序并映射到离散值。
  • 通过二分查找快速定位坐标的离散值。
4、树状数组支持的离线查询

通过树状数组支持的离线查询,可以高效计算矩形内的点数量:

  • 将每个矩形的验证条件转化为点的区间和查询。
  • 使用树状数组动态维护当前坐标系中的点数量。

通过以上步骤,我们可以逐步处理所有矩形,并得到满足条件的最大面积。

3、代码实现

// 树状数组类,用于高效维护区间和
class Fenwick {
    vector<int> tree;

public:
    Fenwick(int n) : tree(n + 1, 0) {}

    // 单点更新,增加一个点
    void add(int i) {
        while (i < tree.size()) {
            tree[i] += 1;
            i += i & -i;
        }
    }

    // 查询前缀和 [1, i]
    int pre(int i) {
        int res = 0;
        while (i > 0) {
            res += tree[i];
            i &= i - 1;
        }
        return res;
    }

    // 查询区间和 [l, r]
    int query(int l, int r) { return pre(r) - pre(l - 1); }
};

class Solution {
public:
    long long maxRectangleArea(vector<int>& xCoord, vector<int>& yCoord) {
        // 使用 x_ma 记录同一列的所有点的纵坐标。使用 y_map 记录同一行的所有点的横坐标。
        map<int, vector<int>> x_map, y_map;
        // 用 below 存储每个点它正下方的点, 用 left 存储每个点它正左方的点
        map<pair<int, int>, int> below, left;

        // 预处理 x_map 和 y_map
        for (int i = 0; i < xCoord.size(); ++i) {
            x_map[xCoord[i]].push_back(yCoord[i]);
            y_map[yCoord[i]].push_back(xCoord[i]);
        }

        // 预处理 below, 对于每个点, 记录它正下方的点
        for (auto& [x, ys] : x_map) {
            sort(ys.begin(), ys.end());
            for (int j = 0; j + 1 < ys.size(); ++j) {
                below[{x, ys[j + 1]}] = ys[j];
            }
        }

        // 预处理 left, 对于每个点, 记录它正左方的点
        for (auto& [y, xs] : y_map) {
            sort(xs.begin(), xs.end());
            for (int j = 0; j + 1 < xs.size(); ++j) {
                left[{xs[j + 1], y}] = xs[j];
            }
        }

        // 离散化坐标
        vector<int> xs, ys;
        for (const auto& [x, _] : x_map) {
            xs.push_back(x);
        }
        for (const auto& [y, _] : y_map) {
            ys.push_back(y);
        }

        sort(xs.begin(), xs.end());
        sort(ys.begin(), ys.end());

        auto discretize = [&](int val, const vector<int>& coords) {
            return lower_bound(coords.begin(), coords.end(), val) - coords.begin();
        };

        // 收集矩形的询问
        vector<tuple<int, int, int, int, long long>> queries;
        for (auto& [x2, list_y] : x_map) {
            for (int j = 0; j + 1 < list_y.size(); ++j) {
                int y1 = list_y[j], y2 = list_y[j + 1];
                int x1 = left.count({x2, y2}) ? left[{x2, y2}] : -1;

                if (x1 != -1 && left.count({x2, y1}) && left[{x2, y1}] == x1 &&
                    below.count({x1, y2}) && below[{x1, y2}] == y1) {
                    queries.emplace_back(discretize(x1, xs), discretize(x2, xs), discretize(y1, ys), discretize(y2, ys), (long long)(x2 - x1) * (y2 - y1));
                }
            }
        }

        // 离线处理
        vector<vector<tuple<int, int, int, int>>> grouped_queries(xs.size());
        for (int i = 0; i < queries.size(); ++i) {
            auto [x1, x2, y1, y2, area] = queries[i];
            if (x1 > 0) {
                grouped_queries[x1 - 1].emplace_back(i, -1, y1, y2);
            }
            grouped_queries[x2].emplace_back(i, 1, y1, y2);
        }

        vector<int> res(queries.size(), 0);
        Fenwick tree(ys.size());
        for (int i = 0; i < xs.size(); ++i) {
            for (int y : x_map[xs[i]]) {
                tree.add(discretize(y, ys) + 1);
            }
            for (auto [qid, sign, y1, y2] : grouped_queries[i]) {
                res[qid] += sign * tree.query(y1 + 1, y2 + 1);
            }
        }

        // 计算最大面积
        long long ans = -1;
        for (int i = 0; i < queries.size(); ++i) {
            if (res[i] == 4) {
                ans = max(ans, get<4>(queries[i]));
            }
        }

        return ans;
    }
};

4、复杂度

  1. 预处理复杂度
    • x_mapy_map 填充:O(n)。
    • belowleft 预处理:O(nlog⁡n)。
  2. 矩形验证:对每个点处理范围查询,复杂度为 O(k),其中 kkk 是点的数量。
  3. 离线查询:使用树状数组动态维护,复杂度为 O(qlog⁡n),其中 q 是矩形数。

总复杂度:O(nlog⁡n+qlog⁡n)。

在这里插入图片描述



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

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

相关文章

【中间件开发】Redis基础命令详解及概念介绍

文章目录 前言一、Redis相关命令详解及原理1.1 string、set、zset、list、hash1.1.1 string1.1.2 list1.1.3 hash1.1.4 set1.1.5 zset 1.2 分布式锁的实现1.3 lua脚本解决ACID原子性1.4 Redis事务的ACID性质分析 二、Redis协议与异步方式2.1 Redis协议解析2.1.1 redis pipeline…

运输层4——TCP格式(重点!)

目录 一、TCP报文段格式 二、最大报文长度 MSS 一、TCP报文段格式 长度&#xff1a;前20个字节固定 后4n个字节&#xff08;报文段格式不固定&#xff09; 1、源端和目的端&#xff1a;各2个字节 作用&#xff1a;指明TCP链接的发送 2、序号 4字节 作用&#xff1…

「Mac玩转仓颉内测版46」小学奥数篇9 - 基础概率计算

本篇将通过 Python 和 Cangjie 双语实现基础概率的计算&#xff0c;帮助学生学习如何解决简单的概率问题&#xff0c;并培养逻辑推理和编程思维。 关键词 小学奥数Python Cangjie概率计算 一、题目描述 假设有一个袋子中有 5 个红球和 3 个蓝球&#xff0c;每次从袋子中随机…

从变更到通知:使用Python和MongoDB Change Streams实现即时事件监听

MongoDB提供了一种强大的功能&#xff0c;称为Change Streams&#xff0c;它允许应用程序监听数据库中的变更事件&#xff0c;并在数据发生变化时立即做出响应。这在mysql数据库是不具备没有这个功能的。又如&#xff1a;我们在支付环节想一直监听支付回调的状态&#xff0c;就…

决策树:ID3、C4.5和CART特征选择方式

1 前言 该文章主要目的是记录ID3、C4.5和CART特征选择方式&#xff0c;这里只对决策树进行简单介绍。 决策树&#xff08;Decision Tree&#xff09;算法是一种有监督学习算法&#xff0c;它利用分类的思想&#xff0c;根据数据的特征构建数学模型&#xff0c;从而达到数据的筛…

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别 一、背景 财务数据是指企业经营活动和财务结果的数据记录&#xff0c;反映了企业的财务状况 与经营成果。对行业、企业的财务数据进行分析&#xff0c;就是要评价其过去的经营业绩、 衡量现在的财务状况、预测…

UE5.5 Geometry库平面切割原理分析

平面切割--FMeshPlaneCut 平面定义: 面上一个点 法线 算法流程如下 求几何体所有顶点和面的有向距离(Signs) Sign计算&#xff1a; float Sign (VertexPos - PlaneOrigin).Dot(PlaneNormal); 遍历所有几何体所有交叉边, 进行SplitEdge 对于位于切割面两侧的交叉边(Sign…

【计算机学习笔记】GB2312、GBK、Unicode等字符编码的理解

之前编写win32程序时没怎么关注过宽字符到底是个啥东西&#xff0c;最近在编写网络框架又遇到字符相关的问题&#xff0c;所以写一篇文章记录一下&#xff08;有些部分属于个人理解&#xff0c;如果有错误欢迎指出&#xff09; 目录 几个常见的编码方式Unicode和UTF-8、UTF-16、…

CSS 快速上手

目录 一. CSS概念 二. CSS语法 1. 基本语法规范 2. CSS的三种引入方式 (1) 行内样式 (2) 内部样式表 (3) 外部样式表 3. CSS选择器 (1) 标签选择器 (2) 类选择器 (3) id选择器 (4) 通配符选择器 (5) 复合选择器 <1> 空格 <2> 没有空格 <3> &q…

【时间之外】IT人求职和创业应知【60】-卡脖子

目录 新闻一&#xff1a;达成合作&#xff0c;将在中国推出生成式人工智能服务 新闻二&#xff1a;机器人新赛道 新闻三&#xff1a;简化用户信息获取流程&#xff0c;提升小程序体验 去年人口出生下降&#xff0c;3年以后&#xff0c;幼儿园要关闭很多&#xff0c;6年以后小…

centos9升级OpenSSH

需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2&#xff08;根据需求进行升级&#xff09; 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…

node.js中实现GETPOST请求

创建基本的服务器 const express require(express); const indexRouter require(./router); // 引入路由 const app express(); const port 3000; // 挂载路由 app.use(/api, indexRouter); app.listen(port, () > {console.log(Server is running on http://localhost…

shell 条件测试

一、命令执行结果判定 && &#xff1a; 在命令执行后如果没有任何报错时会执行符号后面的动作 || &#xff1a; 在命令执行后有报错执行符号后的动作 [rootlong ~]# a10 [rootlong ~]# echo $a 10 [rootlong ~]# [ $a -gt "5" ] && echo yes || e…

JS中的原型链与继承

原型链的类比 JS中原型链&#xff0c;本质上就是对象之间的关系&#xff0c;通过protoype和[[Prototype]]属性建立起来的连接。这种链条是动态的&#xff0c;可以随时变更。 这个就跟C/C中通过指针建立的关系很相似&#xff0c;比如&#xff0c;通过指针建立一个链表&#xf…

【Linux网络编程】第七弹---构建类似XShell功能的TCP服务器:从TcpServer类到主程序的完整实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、TcpServer.hpp 1.1、TcpServer类基本结构 1.2、 Execute() 2、Command.hpp 2.1、Command类基本结构 …

C语言控制语句与案例

控制语句与案例 1. 选择结构 1.1 if 语句 if 语句用于根据条件执行不同的代码块。最基本的语法形式如下&#xff1a; // 单分支 if (条件) {// 条件为真时执行的代码 }// 双分支 if (条件) {// 条件为真时执行的代码 } else {// 条件为假时执行的代码 }// 多分支 if (条件1…

【分子材料发现】——GAP:催化过程中吸附构型的多模态语言和图学习(数据集处理详解)(二)

Multimodal Language and Graph Learning of Adsorption Configuration in Catalysis https://arxiv.org/abs/2401.07408Paper Data: https://doi.org/10.6084/m9.figshare.27208356.v2 1 Dataset CatBERTa训练的文本字符串输入来源于Open Catalyst 2020 &#xff08;OC20…

SpringBoot自动配置底层核心源码

SpringBoot底层核心源码 一、工程创建二、进一步改造三、自动配置 探究SpringBoot的自动配置原理&#xff0c;我们可以自己写一个启动类的注解。 一、工程创建 首先创建一个工程&#xff0c;工程目录如下&#xff1a; 自定义一个启动函数&#xff1a; package org.springboo…

【Springboot3+vue3】从零到一搭建Springboot3+vue3前后端分离项目之后端环境搭建

【Springboot3vue3】从零到一搭建Springboot3vue3前后端分离项目&#xff0c;整合knef4j和mybaits实现基础用户信息管理 后端环境搭建1.1 环境准备1.2 数据库表准备1.3 SpringBoot3项目创建1.4 MySql环境整合&#xff0c;使用druid连接池1.5 整合mybatis-plus1.5.1 引入mybatie…

【书生大模型实战营】Linux 基础知识-L0G1000

前言&#xff1a;书生大模型实战营是上海人工智能实验室开展的大模型系列实践活动&#xff0c;提供免费算力平台&#xff0c;学员通过闯关式任务&#xff0c;可获得免费算力和存储&#xff0c;助力项目实践。本期是第4期&#xff0c;时间从十一月份开始&#xff0c;持续到十二月…