【一百零四】【算法分析与设计】【模板】二维差分,2132. 用邮票贴满网格图,LCP 74. 最强祝福力场,二位差分,差分思想,记录变化值,离散化技巧

【模板】二维差分

描述

给你一个n行m列的矩阵,下标从1开始。

接下来有q次操作,每次操作输入5个参数x1, y1, x2, y2, k

表示把以(x1, y1)为左上角,(x2,y2)为右下角的子矩阵的每个元素都加上k,

请输出操作后的矩阵。

输入描述:

第一行包含三个整数n,m,q.

接下来n行,每行m个整数,代表矩阵的元素

接下来q行,每行5个整数x1, y1, x2, y2, k,分别代表这次操作的参数

1 ≤ n , m ≤ 1000 1\le n,m \le 1000 1n,m1000

1 ≤ q ≤ 1 0 5 1\le q \le 10^5 1q105

1 ≤ x 1 ≤ x 2 ≤ n 1\le x1 \le x2 \le n 1x1x2n

1 ≤ y 1 ≤ y 2 ≤ m 1\le y1 \le y2 \le m 1y1y2m

− 1 0 9 ≤ 矩阵中的元素 ≤ 1 0 9 -10^9 \le 矩阵中的元素 \le 10^9 109矩阵中的元素109

输出描述:

输出n行,每行m个数,每个数用空格分开,表示这个矩阵。

示例1

输入:

2 3 4

1 2 3

4 5 6

1 1 2 2 3

1 2 2 3 -1

1 1 1 3 4

1 1 2 1 1

复制

输出:

9 8 6

8 7 5

复制

差分思想,存储影响的量,和消除影响的量.

在这里插入图片描述

例如我在A区域全部加上k值.

如果原本的值全是0,那么结果应该如下图所示.

在这里插入图片描述

此时我们只需要存储一部分值即可,如下图所示.

在这里插入图片描述

我们对每一行求前缀和,求出来的结果就是我们想要的答案.

可以理解为,从某个位置开始应该影响,影响的值是K,从某个位置开始影响,影响的值是-K.

前面是影响的值,后面是消除影响的值.

也可以理解为原先有很多的重复的数据,而我们只存储改变量,记录从什么时候开始改变了,改变了多少.

接着我们发现上面的数据仍然有许多的重复的数据,一列的K,和一列的-K.

因此我们只需要存储一部分数据,如下图所示.

在这里插入图片描述

对上面的数据先按照列进行求前缀和,再对列的前缀和求行的前缀和,求出来的就是答案.

上面的方法需要遍历两遍diff数组,当然更加常见的是只遍历一遍的diff数组,这个也是可以做到的.

在这里插入图片描述

同样是由这个数据出发,我们需要得到每个数据的列前缀和的行前缀和.

可以利用一点点动态规划的思想,假设我们要得到(i,j)位置的列前缀和的行前缀和值,能不能由其他位置的列前缀和的行前缀和值转移得到?

我们可以先求当前位置的列前缀和,那么就需要用到上一行的列前缀和加上当前元素值.

上一行的列前缀和等于上一行的列前缀和的行前缀和减去上一行上一列的列前缀和的行前缀和.

可以想象我们有一个矩阵全部存储的是列前缀和值.如下图所示.

在这里插入图片描述

假设我要求B位置的值,只需要用蓝色区域前缀和减去绿色区域前缀和即可.

也就是列前缀和的行前缀和相减.

用公式来表示,diff[i-1][j]-diff[i-1][j-1]+g[i][j]这样得到的就是当前位置的列前缀和.

然后再对当前位置列前缀和求行前缀和,只需要加上上一列的列前缀和的行前缀和即可.

用公式来表示,diff[i-1][j]-diff[i-1][j-1]+g[i][j]+diff[i][j-1]这样计算得到的就是当前位置的列前缀和的行前缀和.

填写(i,j)位置需要用到i-1,j-1位置的状态,所以填表顺序i,j从小到大即可.

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define endl '\n'
#define fast() ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)

#define p pair<int,int>
#define ff first
#define ss second
#define _(i,a,b) for(int i=a;i<=b;i++)
#define _1(i,a,b) for(int i=a;i>=b;i--)

int n, m, q;
vector<vector<int>>g;  // 用于存储矩阵元素的二维向量
struct node {
    int x1, y1;
    int x2, y2;
    int k;
};
vector<node>readd;  // 存储每次操作的参数
vector<vector<int>>diff;  // 存储每次操作导致的变化量

void sett(int x1, int y1, int x2, int y2, int k) {
    diff[x1][y1] += k;  // 左上角元素增加k
    diff[x1][y2 + 1] -= k;  // 右上角元素增加k
    diff[x2 + 1][y1] -= k;  // 左下角元素增加k
    diff[x2 + 1][y2 + 1] += k;  // 右下角元素增加k
}

void solve() {
    for (auto& xx : readd) {
        sett(xx.x1, xx.y1, xx.x2, xx.y2, xx.k);  // 对每次操作进行处理
    }

    _(j, 1, m) {  // 对每列进行处理
        _(i, 1, n) {  // 对每行进行处理
            diff[i][j] = diff[i - 1][j] + diff[i][j];  // 更新当前元素的值
        }
    }

    _(i, 1, n) {
        _(j, 1, m) {
            diff[i][j] = diff[i][j - 1] + diff[i][j];  
            g[i][j] += diff[i][j];  // 更新矩阵元素的值
            cout << g[i][j] << " ";  // 输出当前元素值
        }
        cout << endl;  // 换行
    }

}

signed main() {
    fast();  // 快速IO

    cin >> n >> m >> q;  // 输入矩阵的行数、列数和操作次数
    readd.clear();  // 清空操作参数
    diff.assign(n + 5, vector<int>(m + 5, 0));  // 初始化变化量向量
    g.assign(n + 5, vector<int>(m + 5, 0));  // 初始化矩阵向量
    _(i, 1, n) {
        _(j, 1, m) {
            cin >> g[i][j];  // 输入矩阵元素
        }
    }

    _(i, 1, q) {
        node tt;
        cin >> tt.x1 >> tt.y1 >> tt.x2 >> tt.y2 >> tt.k;  // 输入每次操作的参数
        readd.push_back(tt);  // 存储操作参数
    }

    solve();  // 解决问题
}

2132. 用邮票贴满网格图

给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据)。

给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩阵中,且满足以下 限制要求

  1. 覆盖所有 格子。

  2. 不覆盖任何 被占据 的格子。

  3. 我们可以放入任意数目的邮票。

  4. 邮票可以相互有 重叠 部分。

  5. 邮票不允许 旋转

  6. 邮票必须完全在矩阵

如果在满足上述要求的前提下,可以放入邮票,请返回 true ,否则返回 false

示例 1:

在这里插入图片描述

输入: grid = [[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0]], stampHeight = 4, stampWidth = 3 输出: true 解释: 我们放入两个有重叠部分的邮票(图中标号为 1 和 2),它们能覆盖所有与空格子。

示例 2:

在这里插入图片描述

输入: grid = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]], stampHeight = 2, stampWidth = 2 输出: false 解释: 没办法放入邮票覆盖所有的空格子,且邮票不超出网格图以外。

提示:

  • m == grid.length

  • n == grid[r].length

  • 1 <= m, n <= 10(5)

  • 1 <= m * n <= 2 * 10(5)

  • grid[r][c] 要么是 0 ,要么是 1

  • 1 <= stampHeight, stampWidth <= 10(5)

在这里插入图片描述

1表示的是不能放邮票的位置,0表示可以放邮票的位置,而邮票的长宽是固定的,而且邮票不能旋转.

那么可以遍历所有的点,找到此时对于的邮票的左上角点x1,y1,右下角点x2,y2.

计算这个矩形区域里面的累加和,如果累加和是0说明可以放邮票,如果累加和不为0说明不能放邮票.

题目要求我们判断能不能将所有0位置都覆盖上邮票.我们不能,放置邮票之后修改0为1,因为邮票是可以叠在一起的,而是要记录所有盖上邮票的位置,然后比对所有0的位置是否被邮票覆盖.

因此我们可以在放置邮票的位置全部累加1,这个累加值是在一个新的数组上进行,然后遍历所有位置,如果是0就看对应位置是否为0,不为0说明被邮票覆盖了,为0说明没有被覆盖过.

而对一个二维区域全部累加1就可以用差分思维.

class Solution {
public:
    vector<vector<int>> g;    // 二进制矩阵
    int height, width;        // 邮票的高度和宽度
    bool flag;                // 是否能成功放置邮票的标志
    vector<vector<int>> prev; // 原始矩阵的前缀和
    int n, m;                 // 矩阵的行数和列数
    vector<vector<int>> diff; // 差分数组,用于辅助计算

    // 更新差分数组
    void sett(int x1, int y1, int x2, int y2) {
        diff[x1][y1] += 1;
        diff[x1][y2 + 1] -= 1;
        diff[x2 + 1][y1] -= 1;
        diff[x2 + 1][y2 + 1] += 1;
    }

    // 获取差分数组区间和
    int gett(int x1, int y1, int x2, int y2) {
        return prev[x2][y2] - (x1 - 1 >= 0 ? prev[x1 - 1][y2] : 0) -
               (y1 - 1 >= 0 ? prev[x2][y1 - 1] : 0) +
               (x1 - 1 >= 0 && y1 - 1 >= 0 ? prev[x1 - 1][y1 - 1] : 0);
    }

    // 解决问题的函数
    void solve() {
        n = g.size();
        m = g[0].size();
        diff.assign(n + 5, vector<int>(m + 5, 0));
        prev = g;
        flag = false;

        // 计算原始矩阵的前缀和
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                prev[i][j] =
                    (i - 1 >= 0 ? prev[i - 1][j] : 0) +
                    (j - 1 >= 0 ? prev[i][j - 1] : 0) -
                    (i - 1 >= 0 && j - 1 >= 0 ? prev[i - 1][j - 1] : 0) +
                    prev[i][j];
            }
        }

        // 尝试在所有可能的位置放置邮票
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int x1 = i, y1 = j;
                int x2 = i + height - 1, y2 = j + width - 1;
                if(y2>=m)break;
                if(x2>=n)goto f1;
                if (gett(x1, y1, x2, y2) == 0) {
                    sett(x1, y1, x2, y2);
                }
            }
        }
        f1:

        // 计算差分数组的行累加和
        for (int j = 0; j < m; j++) {
            for (int i = 0; i < n; i++) {
                diff[i][j] += (i - 1 >= 0 ? diff[i - 1][j] : 0);
            }
        }

        // 计算差分数组的列累加和
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                diff[i][j] += (j - 1 >= 0 ? diff[i][j - 1] : 0);
            }
        }

        // 检查是否所有空格子都被覆盖
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (g[i][j] == 0) {
                    if (diff[i][j] == 0) {
                        flag = false;
                        return;
                    }
                }
            }
        }

        flag = true;
    }

    // 判断是否可以成功放置邮票的函数
    bool possibleToStamp(vector<vector<int>>& _grid, int _stampHeight,
                         int _stampWidth) {
        g = _grid, height = _stampHeight, width = _stampWidth;
        ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
        solve();  // 解决问题
        return flag;  // 返回结果
    }
};

LCP 74. 最强祝福力场

小扣在探索丛林的过程中,无意间发现了传说中“落寞的黄金之都”。而在这片建筑废墟的地带中,小扣使用探测仪监测到了存在某种带有「祝福」效果的力场。 经过不断的勘测记录,小扣将所有力场的分布都记录了下来。forceField[i] = [x,y,side] 表示第 i 片力场将覆盖以坐标 (x,y) 为中心,边长为 side 的正方形区域。

若任意一点的 力场强度 等于覆盖该点的力场数量,请求出在这片地带中 力场强度 最强处的 力场强度

注意:

  • 力场范围的边缘同样被力场覆盖。

示例 1:

输入: forceField = [[0,0,1],[1,0,1]]

输出:2

解释:如图所示,(0.5, 0) 处力场强度最强为 2, (0.5,-0.5)处力场强度同样是 2。

在这里插入图片描述

示例 2:

输入: forceField = [[4,4,6],[7,5,3],[1,6,2],[5,6,3]]

输出:3

解释:如下图所示, forceField[0]、forceField[1]、forceField[3] 重叠的区域力场强度最大,返回 3

在这里插入图片描述

提示:

  • 1 <= forceField.length <= 100

  • forceField[i].length == 3

  • 0 <= forceField[i][0], forceField[i][1] <= 10^9

  • 1 <= forceField[i][2] <= 10^9

每一个辐力区域的辐力值都是1,这些辐力值都是叠加效果.

我们要做的是将每一个矩形区域累加1,然后计算矩形区域最大的值是多少.

重要的并不是矩形区域累加1,因为这个操作用差分就可以完成,重要的是这些点并不能用区域很好的表示,这里就需要用到离散化的技巧.

在这里插入图片描述

假设我们需要用到的点是1,2,6,8,12,1000,正常来说为了表示这些点,需要开辟至少1000大小空间的数组.

但是我们让上面的每一个需要用到的数依次映射012345,这样只需要用到5个数.

关键点是我们需要用到的数必须排序好了.

依次我们可以用map容器,先存储所有需要用到的点放到里面,但是second先不修改.

当我们将所有需要用到的点都放进去了之后,再遍历map依次赋值second为0,1,2…

这样我们只需要关心映射之后的下标值即可,因为这道题目不关心下标,所以也不需要建立0,1,2…映射原下标的操作.

#define LL long long

class Solution {
public:

    vector<vector<int>> readd; // 记录力场的分布
    map<LL, LL> x_map;       // 横坐标映射
    LL n, m;                  // x_map和y_map的大小
    map<LL, LL> y_map;       // 纵坐标映射
    LL ret;                   // 最终结果
    vector<vector<LL>> diff; // 差分数组,用于计算力场强度

    // 更新差分数组
    void sett(LL x1, LL y1, LL x2, LL y2) {
        diff[x1][y1] += 1;
        diff[x1][y2 + 1] -= 1;
        diff[x2 + 1][y1] -= 1;
        diff[x2 + 1][y2 + 1] += 1;
    }

    // 解决问题
    void solve() {
        n = 0, m = 0;  // 初始化坐标映射大小
        ret = 0;  // 初始化最终结果为0
        x_map.clear(), y_map.clear();  // 清空坐标映射

        // 构建坐标映射
        for (auto& xx : readd) {
            x_map[2LL * xx[0] - xx[2]];
            x_map[2LL * xx[0] + xx[2]];
            y_map[2LL * xx[1] - xx[2]];
            y_map[2LL * xx[1] + xx[2]];
        }

        LL index = 0;
        for (auto& xx : x_map) {
            xx.second = index++;
        }
        n = index;

        index = 0;
        for (auto& xx : y_map) {
            xx.second = index++;
        }
        m = index;

        // 初始化差分数组大小
        diff.assign(n + 5, vector<LL>(m + 5, 0));

        // 计算力场覆盖情况
        for (auto& xx : readd) {
            LL x1 = x_map[2LL * xx[0] - xx[2]];
            LL x2 = x_map[2LL * xx[0] + xx[2]];
            LL y1 = y_map[2LL * xx[1] - xx[2]];
            LL y2 = y_map[2LL * xx[1] + xx[2]];
            sett(x1, y1, x2, y2);
        }

        // 计算力场强度
        for (LL j = 0; j < m; j++) {
            for (LL i = 0; i < n; i++) {
                diff[i][j] += (i - 1 >= 0 ? diff[i - 1][j] : 0);
            }
        }
        for (LL i = 0; i < n; i++) {
            for (LL j = 0; j < m; j++) {
                diff[i][j] += (j - 1 >= 0 ? diff[i][j - 1] : 0);
                ret = max(ret, diff[i][j]);  // 更新最大力场强度
            }
        }
    }

    // 计算最大力场强度的函数
    int fieldOfGreatestBlessing(vector<vector<int>>& _forceField) {
        ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
        readd = _forceField;  // 获取力场数据
        solve();  // 解决问题
        return ret;  // 返回结果
    }
};

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

读书-《蛤蟆先生去看心理医生》

书名蛤蟆先生去看心理医生作者罗伯特戴博德状态阅读中简介该书借用《柳林风声》的故事主角蛤蟆先生&#xff0c;讲述了他接受心理咨询的故事。作者通过陷入抑郁的蛤蟆先生和心理咨询师苍鹭的互动&#xff0c;探索蛤蟆先生爱炫耀、自卑性格和抑郁情绪的来源&#xff0c;指出童年…

二叉树的OJ题

1.二叉树的前序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned array must be malloced, assume caller calls free().*/int TreeeSize(struct Tre…

通过血清拉曼光谱进行COVID-19的高效初步筛查

通过血清拉曼光谱进行COVID-19的高效初步筛查 原创 小王搬运工 时序课堂 2024-06-04 20:04 四川 论文地址&#xff1a;https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/full/10.1002/jrs.6080 论文源码&#xff1a;无 期刊&#xff1a;JOURNAL OF RAMAN SPE…

制作自己的 ButterKnife(使用 AutoService 和 APT 注解处理器在编译期生成 Java 代码)

ButterKnife 开发过 Android 的肯定都知道曾经有这么一个库&#xff0c;它能够让你不用再写 findViewById 这样的代码&#xff0c;这就是大名鼎鼎的 ButterKnife&#xff08;https://github.com/JakeWharton/butterknife&#xff09;。虽然现在这个库已经不再维护&#xff0c;…

C语言基础学习之链表与共同体

数组: 数据结构---操作时候的特点&#xff1a; 优势&#xff1a;随机访问(存取)方便 不足&#xff1a;插入数据删除数据不方便 链式数据结构--链表 struct stu sl; // s1struct stu s2; // s2struct stu s3; //s3 s1-->s2-->s3 特点: 优势:增力和删除数据方便劣势…

2024年手机能做的赚钱软件有哪些?整理了八个手机能做的正规赚钱软件分享

在这个指尖滑动的时代&#xff0c;手机不仅仅是通讯工具&#xff0c;更是我们探索财富的钥匙。你是否曾幻想过&#xff0c;躺在沙发上&#xff0c;轻轻一滑&#xff0c;就能让钱包鼓起来&#xff1f; 今天&#xff0c;就让我们一起来探索那些隐藏在手机里的赚钱秘笈&#xff0c…

ubuntu系统 kubeadm方式搭建k8s集群

服务器环境与要求&#xff1a; 三台服务器 k8s-master01 192.168.26.130 操作系统&#xff1a; Ubuntu20.04 k8s-woker01 192.168.26.140 操作系统&#xff1a; Ubuntu20.04 k8s-woker02 192.168.26.150 操作系统&#xff1a; Ubuntu20.04 最低配置&#xff1a;2…

C++——IO流

C语言的输入和输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键 盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意宽度输出和精度输出控制。C语言借助了相应的缓冲…

信息学奥赛初赛天天练-19-挑战程序阅读-探索因数、所有因数平和、质数的奥秘

PDF文档公众号回复关键字:20240604 1 2023 CSP-J 阅读程序3 阅读程序&#xff08;程序输入不超过数组成字符串定义的范围&#xff1a;判断题正确填√&#xff0c;错误填&#xff1b;除特殊说明外&#xff0c;判断题1.5分&#xff0c;选择题3分&#xff0c;共计40分&#xff…

Windows上配置完整Linux开发环境(六):安装CentOS

1、CentOS vs. Ubuntu 基础和发行周期&#xff1a; CentOS 是基于Red Hat Enterprise Linux (RHEL)的社区版。它与RHEL共享源代码&#xff0c;因此提供与RHEL类似的稳定性。CentOS的版本更新不频繁&#xff0c;通常在RHEL发布新版本后才推出&#xff0c;保持长期支持周期&#…

《STM32Cube高效开发教程基础篇》第7章/案例7.1外部中断示例EXTI方式检测按键

文章目录 目的新建项目CudeMX设置CudeIDE编码 目的 采用外部中断方式检验4个按键的输入 新建项目 在案例6_1基础上另存为Demo7_1EXIT CudeMX设置 CudeIDE编码

MobileNetV4实战:使用MobileNetV4实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文链接&#xff1a;https://arxiv.org/pdf/2404.10518 MobileNetV4&#xff0c;作为新一代移动设备神经网络架构&#xff0c;凭借其创新的通用倒置瓶颈UIB块和Mobile MQA注意力块…

Java程序策——Java连接数据库保姆级教程(超详细步骤)

【Java程序策】——连接数据库 目录 ​编辑 一&#xff1a;在数据库中建立一个表&#xff08;student表&#xff09; 1.1&#xff1a;进入mysql 1.2&#xff1a;建立一个“数据库成员” 1.3&#xff1a;建立一个表&#xff08;student表&#xff09; 1.4&#xff1a;给表…

Springboot+vue二手房交易管理系统

Springbootvue二手房交易管理系统&#xff0c;项目用mybatis与数据库&#xff0c;数据库为mysql&#xff0c;16个表结构。有问题直接加我询问&#xff0c;我会一直在线哒。 功能如下&#xff1a; 房东管理 用户管理 房源信息管理&#xff08;可预约和查看评论&#xff09; 看房…

C语言 指针——函数指针的典型应用:通用排序

目录 编程实现升序和降序排序 如果不使用函数指针编程… 使用函数指针编写一个通用的排序函数 小结 编程实现升序和降序排序 如果不使用函数指针编程… 使用函数指针编写一个通用的排序函数 小结 正确理解指针的概念  指针是一种特殊的数据类型  指针类型的变量&am…

【动态规划】状态压缩dp

发现dp调试打最后二维dp表非常有用 1.吃奶酪类 先出状态&#xff0c;再走到哪 dp[1][0]0;for(int i3;i<maxn;i){//状态 for(int j1;j<n;j){//走过j if(i&(1<<j)){ for(int k0;k<n;k){//刚才在k dp[i][j]; } } } } P1433 吃奶酪 - 洛谷 | 计算机科学教育新生…

ARP欺骗的原理与详细步骤

ARP是什么&#xff1a; 我还记得在计算机网络课程当中&#xff0c;学过ARP协议&#xff0c;ARP是地址转换协议&#xff0c;是链路层的协议&#xff0c;是硬件与上层之间的接口&#xff0c;同时对上层提供服务。在局域网中主机与主机之间不能直接通过IP地址进行通信&#xff0c…

做ozon开单前需要多少钱,做ozon开单前需要多少钱

在电子商务的浪潮中&#xff0c;OZON平台以其独特的商业模式和市场定位&#xff0c;吸引了众多创业者和商家的目光。然而&#xff0c;在决定投身OZON平台之前&#xff0c;对开店成本的全面了解至关重要。本文将详细解析OZON开店前的各项费用&#xff0c;并提供一些高效投入的策…

go的反射和断言

在go中对于一个变量&#xff0c;主要包含两个信息变量类型&#xff08;type&#xff09;和变量值&#xff08;value&#xff09; 可以通过reflect包在运行的时候动态获取变量信息&#xff0c;并能够进行操作 对于Type可以通过reflect.TypeOf()获取到变量的类型信息 reflect.Ty…

网络服务DHCP的安装

DHCP的安装 检查并且安装dhcp有关软件包 rpm -qc dhcp #检查是否存在dhcp yum install -y dhcp #进行yum安装查看系统的配置文件 切换到对应目录查看相关文件配置&#xff0c;发现是空目录。 将官方提供的example复制到原配置文件中 cp /usr/share/doc/dhcp-4.2.5/dhcpd.…