当前位置: 首页 > article >正文

算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】

算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】

  • ---------------高精度---------------
  • 791.高精度加法
  • 题目介绍
  • 方法一:
    • 代码片段解释
      • 片段一:
    • 解题思路分析
  • 792. 高精度减法
  • 题目介绍
  • 方法一:
    • 代码片段解释
      • 片段一:
    • 解题思路分析
  • 793.高精度乘法
  • 题目介绍
  • 方法一:
  • 794.高精度除法
  • 题目介绍
  • 方法一:
    • 解题思路分析
  • ---------------前缀和---------------
  • 795.前缀和
  • 题目介绍
  • 方法一:
    • 解题思路分析
  • 796.子矩阵的和
  • 题目介绍
  • 方法一:
    • 解题思路分析
  • ---------------差分---------------
  • 797.差分
  • 题目介绍
  • 方法一:
    • 代码片段解释
      • 片段一:
      • 片段二:
    • 解题思路分析
  • 798.差分矩阵
  • 题目介绍
  • 方法一:
    • 解题思路分析
  • ---------------双指针---------------
  • 799.最长连续不重复子序列
  • 题目介绍
  • 方法一:
    • 解题思路分析
  • 800.数组元素的目标和
  • 题目介绍
  • 方法一:
  • 2816.判断子序列
  • 题目介绍
  • 方法一:

往期《算法基础》回顾:
算法基础_基础算法【快速排序 + 归并排序 + 二分查找】

---------------高精度---------------

791.高精度加法

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
#include <vector>
using namespace std;string a, b;
vector<int> A, B;
vector<int> ret;vector<int> add(vector<int>& A, vector<int>& B)
{int t = 0;for (int i = 0; i < A.size() || i < B.size(); i++)//(从前往后遍历){if (i < A.size()) t += A[i];if (i < B.size()) t += B[i];ret.push_back(t % 10); //逢十进一t /= 10; // 总共可以进几位}if (t) ret.push_back(1);return ret;
}int main()
{cin >> a >> b;for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //(从后往前存储)for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0'); //(从后往前存储)ret = add(A, B);//注意:从后往前输出数组中的元素时i的初始值为size() - 1for (int i = ret.size() - 1; i >= 0; i--) printf("%d", ret[i]); //(从后往前输出)return 0;
}

代码片段解释

片段一:

if (t) ret.push_back(1);

在代码中,if (t) ret.push_back(1); 这行代码的作用是处理加法运算中最高位的进位。

示例:假设 A = [9, 9](表示数字 99),B = [1](表示数字 1

  • 在循环中,逐位相加:
    • 第一位:9 + 1 = 10ret 添加 0t = 1(进位)
    • 第二位:9 + 0 = 9,加上进位 19 + 1 = 10ret 添加 0t = 1(进位)
  • 循环结束后,t = 1,表示还有进位,因此 ret 添加 1

最终 ret = [0, 0, 1],表示数字 100

疑问:为什么要写成这样if (t) ret.push_back(1);写成if (t) ret.push_back(t);这样看上去不是更合理吗?

  • 在循环结束后,如果 t 不为 0,那么它一定是 1因为加法最多只会产生一个进位

  • 从逻辑上讲,if (t) ret.push_back(t); 也是可行的,因为此时 t 的值只可能是 01

解题思路分析

高精度加法的思路步骤:

第一步:定义一个变量t用于存储当前位的累加和以及处理进位

第二步:使用for循环同时遍历存储加数的这两个数组(从前往后遍历)

  • 第三步:使用if条件语句判断是否遍历完加数1的所有位,若没将该位的值加到变量t中

  • 第四步:使用if条件语句判断是否遍历完加数2的所有位,若没将该位的值加到变量t中

  • 第五步:将变量t除以10的余数(t % 10)添加到结果容器中

  • 第六步:将变量t除以10

第七步:使用if条件语句判断变量t是否为0,若不为0则将其值添加到结果容器中(处理最高位)

第八步:返回结果数组

792. 高精度减法

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
#include <vector>
using namespace std;string a, b;
vector<int> A, B;
vector<int> ret;// 判断是否有 A >= B
bool cmp(vector<int>& A, vector<int>& B)
{if (A.size() != B.size()) return A.size() > B.size();for (int i = A.size() - 1; i >= 0; i--)//(从后往前遍历){if (A[i] != B[i]) return A[i] > B[i]; //A[i] != B[i]时退出函数}return true;
}//高精度减法
vector<int> sub(vector<int>& A, vector<int>& B)
{int t = 0;for (int i = 0; i < A.size(); i++)//(从前往后遍历){t = A[i] - t;if (i < B.size()) t -= B[i];ret.push_back((t + 10) % 10);//t为负数时需要向前借一位当10所以+10,其后的%10对其不会产生影响//t为正数时可不需要做任何操作将其添加到数组,但是+10对其有影响,所以%10消去影响if (t < 0) t = 1; //当前位产生了借位操作else t = 0;}while (ret.size() > 1 && ret.back() == 0) ret.pop_back(); // 去掉前导0return ret;
}int main()
{cin >> a >> b;for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');//(从后往前存储)for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');if (cmp(A, B)){ret = sub(A, B);for (int i = ret.size() - 1; i >= 0; i--) printf("%d", ret[i]);//(从后往前输出)}else{ret = sub(B, A);printf("-");for (int i = ret.size() - 1; i >= 0; i--) printf("%d", ret[i]);}return 0;
}

代码片段解释

片段一:

while (ret.size() > 1 && ret.back() == 0) ret.pop_back(); // 去掉前导0

这段代码的作用是去掉结果中的前导零

在高精度计算中,前导零是指结果中最高位之前的无效零。

  • 例如:计算结果为 00123,实际有效值是 123,前导零 00 是无意义的,需要去掉。

  • ret.size() > 1

    • 这个条件确保结果至少保留一位数字。

    • 如果结果只有一个数字(例如:[0]),即使它是 0,也不能去掉,因为 0 是一个有效的数字。

  • ret.back() == 0

    • ret.back() 获取结果数组的最后一个元素,即当前最高位的数字。

    • 如果最高位是 0,说明这是一个前导零,需要去掉。

  • ret.pop_back()

    • 这个操作将结果数组的最后一个元素(即:当前最高位)移除。

    • 通过循环不断移除前导零,直到最高位不是 0 或者结果只剩一位。

解题思路分析

高精度减法的思路步骤:

第一步:定义一个变量t用于处理借位以及临时存储当前位的计算结果

第二步:使用for循环同时遍历存储加数的这两个数组(从前往后遍历)

  • 第三步:使用减数1的值减去存储借位的变量t,同时将结果赋给t

  • 第四步:使用if条件语句判断是否遍历完减数2的所有位,若没有则使用临时存储当前位的计算结果的变量t减去该位的值

  • 第五步:将变量t+10后的值除以10的余数((t + 10) % 10)添加到结果容器中

  • 第六步:使用if分支语句判断t是否为负值 ,负值将其置为1否则为0

第七步:使用while循环不断的将结果数组中末尾(高位)的0移除

第八步:返回结果数组

高精度加法与高精度减法的不同之处有以下几点:

  1. 使用for循环遍历数组的结束条件不同:
    • 高精度加法:for (int i = 0; i < A.size() || i < B.size(); i++)
    • 高精度减法:for (int i = 0; i < A.size(); i++)
  2. 变量t的使用机制不同:
    • 高精度加法:if (i < A.size()) t += A[i]; if (i < B.size()) t += B[i];
    • 高精度减法:t = A[i] - t; if (i < B.size()) t -= B[i];
  3. 向结果容器中添加的元素的处理不同:
    • 高精度加法:ret.push_back(t % 10); //逢十进一
    • 高精度减法:ret.push_back((t + 10) % 10); //借一当十
  4. 变量t的更新操作不同
    • 高精度加法:t /= 10;
    • 高精度减法:if (t < 0) t = 1; else t = 0;
  5. 最后遇到的问题不同
    • 高精度加法:if (t) ret.push_back(1); //处理最高位的进位
    • 高精度减法:while (ret.size() > 1 && ret.back() == 0) ret.pop_back(); // 去掉前导零

793.高精度乘法

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
#include <vector>
using namespace std;string a;
long long b; //相对于乘数1,乘数2的值相对小一点,long long 类型足以容纳vector<int> A;
vector<int> B;
vector<int> ret;vector<int> mul(vector<int>& A, vector<int>& B)
{int t = 0;for (int i = 0; i < A.size(); i++)//(从前往后遍历){t = (A[i] * b) + t;ret.push_back(t % 10);t = t / 10;// 进位的大小t}if (t) ret.push_back(t);while (ret.size() > 1 && ret.back() == 0) ret.pop_back();return ret;
}int main()
{cin >> a >> b;//用数组存储乘数的每位数字for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); //(从后往前存储)//处理数据:ret = mul(A, B);//输出数据:for (int i = ret.size() - 1; i >= 0; i--) cout << ret[i];//(从后往前输出)return 0;
}

794.高精度除法

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;string a;
int b;
vector<int> A;
vector<int> ret;// A / b,商是C,余数是r
vector<int> div(vector<int>& A, int b, int& t)
{for (int i = A.size() - 1; i >= 0; i--)//(从后往前遍历){t = t * 10 + A[i];ret.push_back(t / b);t %= b;}reverse(ret.begin(), ret.end()); //数组前面存储的高位,被反转为存储的低位(方便消去前导零)while (ret.size() > 1 && ret.back() == 0) ret.pop_back();return ret;
}int main()
{cin >> a >> b;for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');//(从后往前存储)int t;ret = div(A, b, t);for (int i = ret.size() - 1; i >= 0; i--) printf("%d", ret[i]);//(从后往前输出)cout << endl << t << endl;return 0;
}

解题思路分析

高精度除法的思路步骤:

第一步:定义一个变量t用于存储当前的余数

第二步:使用for循环同时遍历存储加数的这两个数组(从后往前遍历:先处理高位)

  • 第三步:变量t乘10再加上当前除数1的值,同时将结果赋给t

  • 第四步:将变量t的值除以除数2的商添加到结果数组中

  • 第五步:用变量t的值除以除数2的余数更新变量t

第六步:对结果数组中的所有元素进行反转

第七步:使用while循环不断的将结果数组中末尾(高位)的0移除

第八步:返回结果数组

高精度乘法与高精度除法的不同之处有以下几点:

  1. 使用for循环遍历数组的方向不同:
    • 高精度乘法:for (int i = 0; i < A.size(); i++)//(从前往后遍历)
    • 高精度除法:for (int i = A.size() - 1; i >= 0; i--)//(从后往前遍历)
  2. 变量t的使用机制不同:
    • 高精度乘法:t = (A[i] * b) + t;
    • 高精度除法:t = t * 10 + A[i];
  3. 向结果容器中添加的元素的处理不同:
    • 高精度乘法:ret.push_back(t % 10);
    • 高精度除法:ret.push_back(t / b);
  4. 变量t的更新操作不同:
    • 高精度乘法: t = t / 10;
    • 高精度除法:t %= b;
  5. 处理最高位的进位不同:
    • 高精度乘法: if (t) ret.push_back(t);
    • 高精度除法:不需要处理
  6. 消去前导零的方式不同:
    • 高精度乘法: while (ret.size() > 1 && ret.back() == 0) ret.pop_back();
    • 高精度除法:reverse(ret.begin(), ret.end()); while (ret.size() > 1 && ret.back() == 0) ret.pop_back()

---------------前缀和---------------

795.前缀和

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
using namespace std;const int N = 1e5+10;
int n, m;
int a[N], s[N];int main()
{scanf("%d%d", &n, &m);//构造前缀和数组s  (原数组和前缀和数组都从下标1处开始存放元素,应为我们要预留s0为0)for (int i = 1; i <= n; i++) scanf("%d", &a[i]);for (int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];while (m--){int l, r;scanf("%d%d", &l, &r);printf("%d\n", s[r] - s[l - 1]);}return 0;
}

解题思路分析

如何 去求 一个一维矩阵的前缀和?(假如说数组s是某一维数组的前缀和数组)

s[i] = s[i - 1] + a[i];

如何 使用 一个一维矩阵的前缀和?(假如说我们要求得某一维数组中区间为[l,r]之间的元素之和)

结果 = s[r] - s[l - 1]

796.子矩阵的和

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
using namespace std;const int N = 1010;
int n, m, q;
int a[N][N], s[N][N];int main()
{scanf("%d%d%d", &n, &m, &q);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)scanf("%d", &a[i][j]);// 初始化前缀和数组for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];// 询问while (q--){int x1, y1, x2, y2;scanf("%d%d%d%d", &x1, &y1, &x2, &y2);printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]);//使用前缀和数组}return 0;
}

解题思路分析

如何 去求 一个二维矩阵的前缀和?(假如说数组s是某二维数组的前缀和数组)

s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];

如何 使用 一个二维矩阵的前缀和?(假如说我们要求得某二维数组中下标为[x1,y1]到 [x2,y2]之间的矩阵的元素之和)

结果 = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]

---------------差分---------------

797.差分

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
using namespace std;const int N = 100010;
int n, m;
int a[N], b[N];void insert(int l, int r, int c)
{b[l] += c;b[r + 1] -= c;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) scanf("%d", &a[i]); // 原数组a的赋值for (int i = 1; i <= n; i++) insert(i, i, a[i]); // 通过原数组a为差分数组b进行赋值while (m--){int l, r, c;scanf("%d%d%d", &l, &r, &c);insert(l, r, c);}for (int i = 1; i <= n; i++){a[i] = a[i - 1] + b[i];printf("%d ", a[i]);}return 0;
}

代码片段解释

片段一:

for (int i = 1; i <= n; i++) insert(i, i, a[i]);

这段代码中的 for (int i = 1; i <= n; i++) insert(i, i, a[i]); 的作用是初始化差分数组 b (差分数组 b 是原数组 a 的差分表示)


差分数组的特点是:

  • b[i] = a[i] - a[i - 1](对于 i > 1
  • b[1] = a[1](因为 a[0] 不存在,默认为 0

通过差分数组,我们可以 高效地对原数组的某个区间进行批量加减操作

  • 如果要对原数组 a 的区间 [l, r] 中的每个元素加上 c,只需要:
    • b[l] += c
    • b[r + 1] -= c
  • 最后通过前缀和运算(b[i] += b[i - 1])还原出更新后的原数组

for (int i = 1; i <= n; i++) insert(i, i, a[i]); 的作用:将原数组 a 转换为差分数组 b

具体过程

  1. 初始时,差分数组 b 的所有元素都是 0
  2. 对于每个 i(从 1n),执行 insert(i, i, a[i])
    • b[i] += a[i]:将 a[i] 的值赋给 b[i]
    • b[i + 1] -= a[i]:将 a[i] 的值从 b[i + 1] 中减去
  3. 最终,差分数组 b 的值满足:
    • b[1] = a[1]
    • b[i] = a[i] - a[i - 1](对于 i > 1

示例:假设原数组 a 为:a = [0, 1, 2, 3, 4](注意:a[0] 不存在,默认为 0

执行 for (int i = 1; i <= n; i++) insert(i, i, a[i]); 后,差分数组 b 为:

b = [0, 1, 1, 1, 1, -4]

解释

  • b[1] = a[1] = 1
  • b[2] = a[2] - a[1] = 2 - 1 = 1
  • b[3] = a[3] - a[2] = 3 - 2 = 1
  • b[4] = a[4] - a[3] = 4 - 3 = 1
  • b[5] = -a[4] = -4(因为 b[5] -= a[4]

片段二:

insert(l, r, c);

在这段代码中,insert(l, r, c); 的作用是对差分数组 b 进行区间更新,从而高效地对原数组 a 的某个区间 [l, r] 中的所有元素加上一个常数 c


insert(l, r, c) 的作用:对差分数组 b 进行区间更新,表示对原数组 a 的区间 [l, r] 中的每个元素加上 c

//insert 函数的定义是:
void insert(int l, int r, int c)
{b[l] += c;b[r + 1] -= c;
}
  1. b[l] += c

    • 表示从位置 l 开始,每个元素都加上 c
    • 这是因为差分数组 b 的前缀和会累加 b[l],从而影响从 l 开始的所有元素。
  2. b[r + 1] -= c

    • 表示从位置 r + 1 开始,每个元素都减去 c
    • 这是为了抵消 b[l] += c 的影响,确保只有区间 [l, r] 中的元素被更新。

示例:区间更新

假设原数组 a 为:

a = [1, 2, 3, 4, 5]

对应的差分数组 b 为:

b = [1, 1, 1, 1, 1]

(因为 b[i] = a[i] - a[i - 1]

现在,我们希望对区间 [2, 4] 中的每个元素加上 2。调用 insert(2, 4, 2) 后:

  • b[2] += 2b 变为 [1, 3, 1, 1, 1]
  • b[5] -= 2b 变为 [1, 3, 1, 1, -1]

最后,通过前缀和运算还原出更新后的原数组:

a[1] = b[1] = 1
a[2] = b[1] + b[2] = 1 + 3 = 4
a[3] = b[1] + b[2] + b[3] = 1 + 3 + 1 = 5
a[4] = b[1] + b[2] + b[3] + b[4] = 1 + 3 + 1 + 1 = 6
a[5] = b[1] + b[2] + b[3] + b[4] + b[5] = 1 + 3 + 1 + 1 - 1 = 5

更新后的原数组 a 为:

a = [1, 4, 5, 6, 5]

可以看到,区间 [2, 4] 中的每个元素都加上了 2

解题思路分析

构造一维差分数组的核心:

void insert(int l, int r, int c)
{b[l] += c;b[r + 1] -= c;
}

第一步:使用for循环通过一维原数组为一维差分数组赋值

第二步:使用while循环将某个子区间中的元素都加上c

第三步:使用for循环通过一维差分数组还原出一维原数组

798.差分矩阵

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
using namespace std;const int N = 1010;
int n, m, q;
int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c)
{b[x1][y1] += c;b[x1][y2 + 1] -= c;b[x2 + 1][y1] -= c;b[x2 + 1][y2 + 1] += c;
}int main()
{scanf("%d%d%d", &n, &m, &q);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)scanf("%d", &a[i][j]);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)insert(i, j, i, j, a[i][j]);while (q--){int x1, y1, x2, y2, c;scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c);insert(x1, y1, x2, y2, c);}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j];printf("%d ", a[i][j]);}puts("");}return 0;
}

解题思路分析

构造二维差分数组的核心:

void insert(int x1, int y1, int x2, int y2, int c)
{b[x1][y1] += c;b[x1][y2 + 1] -= c;b[x2 + 1][y1] -= c;b[x2 + 1][y2 + 1] += c;
}

第一步:使用双重for循环通过二维原数组为二维差分数组赋值

第二步:使用while循环将某个子矩阵中的元素都加上c

第三步:使用双重for循环通过二维差分数组还原出二维原数组

---------------双指针---------------

799.最长连续不重复子序列

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
using namespace std;const int N = 1e5+10;
int n;
int a[N], s[N];
int res = 0;int main()
{cin >> n;for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0, j = 0; i < n; i++){s[a[i]]++;while (s[a[i]] > 1){s[a[j]]--;j++;}res = max(res, i - j + 1);}cout << res << endl;return 0;
}

解题思路分析

双指针的使用思路和步骤:

第一步:使用for循环经典的开头for (int i = 0, j = 0; i < n; i++)

第二步:根据题目的要求进行不同的操作

第三步:使用while循环书写满足条件时的重复行为

第四步:统计结果

800.数组元素的目标和

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
#include <algorithm>
using namespace std;const int N = 100010;
int n, m, x;
int a[N], b[N];int main()
{scanf("%d%d%d", &n, &m, &x);for (int i = 0; i < n; i++) scanf("%d", &a[i]);for (int i = 0; i < m; i++) scanf("%d", &b[i]);for (int i = 0, j = m - 1; i < n; i++){while (j >= 0 && a[i] + b[j] > x) j--;if (a[i] + b[j] == x){printf("%d %d\n", i, j);break;}}return 0;
}

2816.判断子序列

题目介绍

在这里插入图片描述

方法一:

#include <iostream>
#include <cstring>
using namespace std;const int N = 100010;
int n, m;
int a[N], b[N];int main()
{scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) scanf("%d", &a[i]);for (int i = 0; i < m; i++) scanf("%d", &b[i]);int i = 0, j = 0;while (i < n && j < m){if (a[i] == b[j]) i++;j++;}if (i == n) puts("Yes");else puts("No");return 0;
}

相关文章:

算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】

算法基础_基础算法【高精度 前缀和 差分 双指针】 ---------------高精度---------------791.高精度加法题目介绍方法一&#xff1a;代码片段解释片段一&#xff1a; 解题思路分析 792. 高精度减法题目介绍方法一&#xff1a;代码片段解释片段一&#xff1a; 解题思路分析 7…...

多线程猜数问题

题目&#xff1a;线程 A 生成随机数&#xff0c;另外两个线程来猜数&#xff0c;线程 A 可以告诉猜的结果是大还是小&#xff0c;两个线程都猜对后&#xff0c;游戏结束&#xff0c;编写代码完成。 一、Semaphore 多个线程可以同时操作同一信号量&#xff0c;由此实现线程同步…...

Ubuntu环境安装

1. 安装gcc、g和make sudo apt update sudo apt install build-essential 2. 安装cmake ubuntu安装cmake的三种方法&#xff08;超方便&#xff01;&#xff09;-CSDN博客 3. 安装ssh sudo apt-get install libssl-dev...

【家政平台开发(6)】筑牢家政平台安全防线:全方位隐私与安全需求解析

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析&#xff0c;剖析家政行业现状、挖掘用户需求与梳理功能要点&#xff0c;到系统设计阶段的架构选型、数据库构建&#xff0c;再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化…...

Python数据类型-list

列表(List)是Python中最常用的数据类型之一&#xff0c;它是一个有序、可变的元素集合。 1. 列表基础 创建列表 empty_list [] # 空列表 numbers [1, 2, 3, 4, 5] # 数字列表 fruits [apple, banana, orange] # 字符串列表 mixed [1, hello, 3.14, True] # 混合类型…...

SpringBoot工程如何考虑优化使其视频请求更流畅

为了优化Spring Boot以提升前端视频读取的流畅性&#xff0c;可以从以下几个关键方向入手&#xff1a; 1. 分块传输与HTTP范围请求&#xff08;Range Requests&#xff09; 视频播放通常需要支持随机跳转进度&#xff0c;需确保后端正确处理HTTP Range头&#xff0c;实现按需传…...

如何使用cpp操作香橙派GPIO --使用<wiringPi.h>

香橙派是国产SBC &#xff0c;对标树莓派。不过国内的开发环境确实挺惨的&#xff0c;没多少帖子讨论。楼主决定从今天起&#xff0c;不定期更新香橙派的教程。 今天的教程是如何使用香橙派下载wiringOP 并使用CPP操作GPIO 操作GPIO 下载wiringPi 检查git 版本克隆wiringPi…...

IP(Internet Protocol,互联网协议)

IP&#xff08;Internet Protocol&#xff0c;互联网协议&#xff09;地址是网络通信的核心标识&#xff0c;其作用可概括为以下关键点&#xff1a; 1. 核心作用 设备唯一标识 为联网设备&#xff08;电脑、手机、服务器等&#xff09;提供全球唯一的逻辑地址&#xff0c;确保数…...

nacos-sdk-go v2.29 中一个拼写错误,我定位了3个小时 ……

文章目录 问题背景问题现象问题定位解决方案经验总结 问题背景 今天在给项目增加服务注册和发现功能时,选择了 nacos 作为服务注册中心。在使用 nacos-sdk-go v2.29 版本进行开发时,遇到了一个令人啼笑皆非的问题,足足花了3个小时才找到原因。 问题现象 在实现服务订阅通知功…...

Linux中的文件寻址

Linux的层级结构 在Linux中一切皆文件 其中 要注意在命令行中看实际选择写哪一种路径 相对路径 绝对路径名称的简写&#xff0c;省略了用户当前所在的系统位置此名称只有在管理当前所在系统目录中子文件时才能使用系统中不以/开有的文件名称都为相对路径在程序操作时会自动…...

vue省市区懒加载,用el-cascader 新增和回显

el-cascader对于懒加载有支持方法&#xff0c;小难点在于回显的时候&#xff0c;由于懒加载第一次只有一层&#xff0c;所以要根据选中id数组一层层的加载。 子组件 <template><el-cascaderref"cascaderRef"v-model"selectedValue":props"…...

静态时序分析:时钟标记(作为数据使用的时钟)及其分析方式

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 引言 一般情况下&#xff0c;设计中的时钟路径和数据路径是严格区分开的&#xff1a;时钟路径即从时钟源对象&#xff08;时钟定义点&#xff09;到触发器的时钟…...

AI学习记录-QWQ32b太强了

业务理解能力爆表&#xff0c;指令遵循能力极强&#xff0c;才32b成本极低&#xff0c;大量的公司的项目可以嵌入到自己的项目当中了&#xff0c;再fineture一下&#xff0c;以后不上AI的系统都卖不出去了。 试验1 输出 试验2: 输出...

【奇点时刻】GPT-4o新生图特性深度洞察报告

以下报告围绕最新推出的「GPT4o」最新图像生成技术展开&#xff0c;旨在让读者从整体层面快速了解其技术原理、功能亮点&#xff0c;以及与其他常见图像生成或AI工具的对比分析&#xff0c;同时也会客观探讨该技术在应用过程中可能遇到的挑战与限制。 1. 技术背景概述 GPT4o新…...

STM32 FATFS - 在spi的SD卡中运行fatfs

参考文章 STM32 CubeMX 硬件SPI SD卡 FATFS_stm32cubemx fatfs-CSDN博客 例程地址&#xff1a;STM32FatFS: 基于stm32的fatfs例程&#xff0c;配合博客文章 基于野火STM32MINI开发板 STM32配置 系统模式配置 输出串口配置 SPI配置 使用全双工模式&#xff0c;禁用硬件…...

我的世界进阶模组开发教程——地形生成(1)

找到mc的屎山代码,找到net.minecraft.world.level.levelgen包,我们来看看mc是如何完成地形生成的 SurfaceRules 代码结构与核心功能解析 该代码是 Minecraft 世界生成模块中地表规则(SurfaceRules)的核心实现,用于控制地形表面的方块生成逻辑。以下从多角度进行拆解分析…...

FreeCAD傻瓜教程-装配体Assembly的详细使用过程

源起&#xff1a; 看了官方的教程说明&#xff0c;感觉太过简单&#xff0c;好多细节没有体现&#xff0c;且该部分的翻译还没有。这里是做个记录&#xff0c;对使用过程中的细节进行图文说明&#xff0c;以方便真正的新手能够快速应用&#xff0c;制作出自己的零件&#xff0c…...

Linux快速安装docker和docker-componse步骤

在 CentOS 7 上安装 Docker 和 Docker Compose 的步骤如下&#xff1a; 1. 安装 Docker 1.1. 更新系统 首先&#xff0c;确保你的系统是最新版本&#xff1a; sudo yum update -y1.2. 安装必要的包 安装 yum-utils&#xff0c;这是管理 YUM 源的工具&#xff1a; sudo yu…...

数字电子技术基础(三十七)——利用Multisim软件实现16线-4线编码器和4线-16线译码器

1 利用Multisim软件来实现16线-4线编码器 在之前的博客中完成了利用Multisim软件实现8线-3线优先编码器&#xff0c;现在使用Multisim软件来实现16线-4线编码器&#xff0c;其原理图如下所示&#xff1a; 使用字发生器来实现16线-4线编码器&#xff0c;器件选择&#xff1a; …...

02_MySQL安装及配置

文章目录 一、下载二、安装及配置2.1、选择安装类型2.2、检查需要的依赖2.3、安装2.4、配置2.4.1、配置类型和网络2.4.2、配置账户和角色2.4.3、配置Windows服务2.4.4、让配置生效 2.5、验证是否安装成功 三、卸载3.1、运行MySQL安装工具3.2、卸载及清理3.3、卸载之后的检查工作…...

Windows11,微软软件(VSCODE/EDG)错误登录,0x80190001错误

修改网络设置 运行以下命令&#xff0c;打开网络共享中心 Start-Process "control.exe" -ArgumentList "/name Microsoft.NetworkAndSharingCenter" 点击左下角的 选项 TLS 1.1 1.2 1.3 这三个选项 1.0 不建议启用&#xff0c;不安全 1.1 可以不用启用…...

WPF 浅述IsHitTestVisible属性

WPF 浅述IsHitTestVisible属性 IsHitTestVisible 属性是 WPF 中一个非常重要的属性&#xff0c;它决定了一个控件是否可以作为 hit test 的一部分被检测到。理解这个属性对于处理交互事件&#xff08;如鼠标点击、触摸等&#xff09;非常重要。 IsHitTestVisible 属性的含义&am…...

力扣刷题-热题100题-第29题(c++、python)

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/?envTypestudy-plan-v2&envIdtop-100-liked 计算链表长度 对于链表&#xff0c;难的就是不知道有多少元素&#xff…...

NLP高频面试题(三十)——LLama系列模型介绍,包括LLama LLama2和LLama3

本文深入介绍Meta推出的LLama系列模型&#xff0c;包括LLama、LLama2和LLama3&#xff0c;探讨了它们的技术创新、应用场景以及对大语言模型发展的重要推动作用。通过系统地回顾各代模型的进化过程&#xff0c;分析其核心特性与技术亮点&#xff0c;为读者提供全面且深入的理解…...

torch.nn.Conv2d介绍——Pytorch中的二维卷积层

torch.nn.Conv2d是torch.nn模块中的二维卷积层类&#xff0c;用于构建神经网络中的二维卷积层。 1、基本语法 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone)将 2D …...

阻止上传可执行程序

点击工具中的文件服务器资源管理器 、然后点击文件屏蔽管理中的文件屏蔽&#xff0c;然后导入目标文件选择要限制的属性即可...

DirectX修复工具免费版下载安装教程(附安装包)

文章目录 前言一、DirectX修复工具免费版介绍二、DirectX修复工具免费版安装教程1. 下载安装包2. 解压文件3. 以管理员身份运行4. 开始检测与修复5. 查看修复详情 前言 本教程主要介绍的是DirectX修复工具免费版下载安装教程&#xff0c;帮您轻松解决 DirectX 相关问题。 一、…...

UE5学习笔记 FPS游戏制作33 游戏保存

文章目录 核心思想创建数据对象创建UIUI参数和方法打开UI存档文件的位置可以保存的数据类型 核心思想 UE自己有保存游戏的功能&#xff0c;核心节点&#xff0c;类似于json操作&#xff0c;需要一个数据类的对象来进行保存和读取 创建存档 加载存档 保存存档 创建数据对象…...

Git与SVN的区别以及各自的优势

前言&#xff1a;版本控制的诞生与意义 在软件开发的漫长历程中&#xff0c;代码的迭代与协作始终是核心挑战。从早期的“文件夹版本”到现代的分布式系统&#xff0c;版本控制系统&#xff08;VCS&#xff09;的进化史&#xff0c;本质上是人类对协作效率与数据安全的不懈追求…...

PipeWire 音频设计与实现分析三——日志子系统

日志子系统 PipeWire 的日志子系统的设计分为多个层次。PipeWire 用 struct spa_log 对象描述日志组件&#xff0c;用 struct spa_log_methods 对象描述日志组件打印各层级日志的多个方法。PipeWire 为日志子系统添加了 topic 机制&#xff0c;不同文件中的日志按功能以不同的…...