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

news2025/2/23 17:23:03

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)。

在这里插入图片描述



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

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

相关文章

华为服务器使用U盘重装系统

一、准备工作 下载官方系统&#xff08;注意服务器CPU的架构是x86-64还是aarch64&#xff0c;不然可能报意想不到的错&#xff09;制作启动U盘&#xff08;下载rufus制作工具&#xff0c;注意文件系统选FAT32还是NTFS&#xff09; 二、安装步骤 将U盘插入USB接口重启服务器…

java八股-流量封控系统

文章目录 请求后台管理的频率-流量限制流量限制的业务代码UserFlowRiskControlFilter 短链接中台的流量限制CustomBlockHandler 对指定接口限流UserFlowRiskControlConfigurationSentinelRuleConfig 请求后台管理的频率-流量限制 根据登录用户做出控制&#xff0c;比如 x 秒请…

Nginx限流实践-limit_req和limit_conn的使用说明

注意&#xff1a; 本文内容于 2024-12-07 19:38:40 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;Nginx限流实践。感谢您的关注与支持&#xff01; 一、限流 之前我有记录通过CentOS7定时任务实…

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…

【CSS in Depth 2 精译_068】11.2 颜色的定义(下):CSS 中的各种颜色表示法简介

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 ✔️ 11.2.2.…

16-02、JVM系列之:内存与垃圾回收篇(二)

JVM系列之&#xff1a;内存与垃圾回收篇(二) ##本篇内容概述&#xff1a; 1、堆Heap Area 2、方法区Method Area 3、运行时数据区总结 4、对象的实例化内存布局和访问定位一、堆 Heap Area 1、堆的核心概念 一个JVM实例只存在一个堆内存&#xff0c;堆也是Java内存管理的核心…

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势&#xff0c;帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇&#xff0c;审校为邱雪和许东舟。 一、会议介绍 ICPR…

网络安全知识:网络安全网格架构

在数字化转型的主导下&#xff0c;大多数组织利用多云或混合环境&#xff0c;包括本地基础设施、云服务和应用程序以及第三方实体&#xff0c;以及在网络中运行的用户和设备身份。在这种情况下&#xff0c;保护组织资产免受威胁涉及实现一个统一的框架&#xff0c;该框架根据组…

树莓集团是如何链接政、产、企、校四个板块的?

树莓集团作为数字影像行业的积极探索者与推动者&#xff0c;我们通过多维度、深层次的战略举措&#xff0c;将政、产、企、校四个关键板块紧密链接在一起&#xff0c;实现了资源的高效整合与协同发展&#xff0c;共同为数字影像产业的繁荣贡献力量。 与政府的深度合作政府在产业…

关于睡懒觉

我们经常听到一个词&#xff1a;睡懒觉。 我认为&#xff0c;睡懒觉这个词&#xff0c;是错误的。 人&#xff0c;是需要睡眠的&#xff0c;睡不够&#xff0c;就不会醒。睡够了&#xff0c;自然会醒&#xff0c;也不想继续睡。不信你试试&#xff0c;睡够了&#xff0c;你…

简单的动态带特殊符号敏感词校验

简单的动态带特殊符号敏感词校验 敏感词之前进行了简单了解&#xff0c;使用结巴分词自带词库可以实现&#xff0c;具体参考我的如下博文 敏感词校验 此次在此基础进行了部分优化&#xff0c;优化过程本人简单记录一下&#xff0c;具体优化改造步骤如下所示 1.需求 我们公司…

C++(十二)

前言&#xff1a; 本文将进一步讲解C中&#xff0c;条件判断语句以及它是如何运行的以及内部逻辑。 一&#xff0c;if-else,if-else语句。 在if语句中&#xff0c;只能判断两个条件的变量&#xff0c;若想实现判断两个以上条件的变体&#xff0c;就需要使用if-else,if-else语…

【Redis】Redis基础——Redis的安装及启动

一、初识Redis 1. 认识NoSQL 数据结构&#xff1a;对于SQL来说&#xff0c;表是有结构的&#xff0c;如字段约束、字段存储大小等。 关联性&#xff1a;SQL 的关联性体现在两张表之间可以通过外键&#xff0c;将两张表的数据关联查询出完整的数据。 查询方式&#xff1a; 2.…

Devops 实践

Devops 实践 基本概念jenkins实践安装jenkins仓库环境准备代码环境准备第一次构建持续集成持续部署集成插件 优秀实践心得体会 参考 摘要&#xff1a;本文首先将介绍一些基本概念&#xff0c;包括Devops&#xff0c;CI/CD等&#xff0c;然后基于知名开源CI/CD工具jenkins进行实…

学生信息管理系统(简化版)数据库部分

使用Mysql&#xff0c;与navicat工具 下面是mysql创建的代码&#xff0c;可做必要修改 -- 创建学生学籍信息表 CREATE TABLE StudentEnrollment (-- 学号&#xff0c;作为主键student_id VARCHAR(8) NOT NULL,-- 学生姓名stu_name VARCHAR(8) NOT NULL,-- 学生性别gender VARC…

图生3d 图生全景 学习笔记

目录 instantsplat Aluciddreamer ZoeDepth 会自动下载模型&#xff1a; 图生全景图SD-T2I-360PanoImage&#xff1a; instantsplat Sparse-view SfM-free Gaussian Splatting in Seconds 稀疏视图无SfM高斯喷洒 GitHub - NVlabs/InstantSplat: InstantSplat: Sparse-vi…

PHP:将数据传递给Grid++Report模板进行打印

模板参考 这里使用的模板test111.grt参照进行生成 &#xff0c;需要确保字段对应才能将数据进行传递 GridReport:自定义模板设计&#xff08;自由表格使用&#xff09;&#xff0c;详细教程-CSDN博客https://blog.csdn.net/weixin_46001736/article/details/144315191?spm10…

【C#】新建窗体文件,Form、UserControl

从用途、功能性和架构方面进行描述。 1. 继承自 Form 的窗体&#xff08;通常是窗口&#xff09;&#xff1a; 在 C# 中&#xff0c;Form 是用于创建应用程序的主窗口或对话框窗口的类。当您继承自 Form 时&#xff0c;您创建的是一个完整的窗口&#xff0c;可以显示内容、与…

Ubuntu22.04搭建LAMP环境(linux服务器学习笔记)

目录 引言&#xff1a; 一、系统更新 二、安装搭建Apache2 1.你可以通过以下命令安装它&#xff1a; 2.查看Apache2版本 3.查看Apache2运行状态 4.浏览器访问 三、安装搭建MySQL 1.安装MySQL 2.查看MySQL 版本 3.安全配置MySQL 3.1是否设置密码&#xff1f;(按y|Y表…

小尺寸低功耗蓝牙模块在光伏清扫机器人上的应用

一、引言 随着可再生能源的迅速发展&#xff0c;光伏发电系统的清洁与维护变得越来越重要。光伏清扫机器人通过自动化技术提高了清洁效率&#xff0c;而蓝牙模组的集成为这些设备提供了更为智能的管理和控制方案。 二、蓝牙模组的功能与实现&#xff1a; 蓝牙模组ANS-BT103M…