算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】
算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】
- ---------------高精度---------------
- 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 = 10
,ret
添加0
,t = 1
(进位)- 第二位:
9 + 0 = 9
,加上进位1
,9 + 1 = 10
,ret
添加0
,t = 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
的值只可能是0
或1
解题思路分析
高精度加法的思路步骤:
第一步:定义一个变量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移除
第八步:返回结果数组
高精度加法与高精度减法的不同之处有以下几点:
- 使用for循环遍历数组的结束条件不同:
- 高精度加法:
for (int i = 0; i < A.size() || i < B.size(); i++)
- 高精度减法:
for (int i = 0; i < A.size(); i++)
- 变量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];
- 向结果容器中添加的元素的处理不同:
- 高精度加法:
ret.push_back(t % 10); //逢十进一
- 高精度减法:
ret.push_back((t + 10) % 10); //借一当十
- 变量t的更新操作不同
- 高精度加法:
t /= 10;
- 高精度减法:
if (t < 0) t = 1; else t = 0;
- 最后遇到的问题不同
- 高精度加法:
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移除
第八步:返回结果数组
高精度乘法与高精度除法的不同之处有以下几点:
- 使用for循环遍历数组的方向不同:
- 高精度乘法:
for (int i = 0; i < A.size(); i++)//(从前往后遍历)
- 高精度除法:
for (int i = A.size() - 1; i >= 0; i--)//(从后往前遍历)
- 变量t的使用机制不同:
- 高精度乘法:
t = (A[i] * b) + t;
- 高精度除法:
t = t * 10 + A[i];
- 向结果容器中添加的元素的处理不同:
- 高精度乘法:
ret.push_back(t % 10);
- 高精度除法:
ret.push_back(t / b);
- 变量t的更新操作不同:
- 高精度乘法:
t = t / 10;
- 高精度除法:
t %= b;
- 处理最高位的进位不同:
- 高精度乘法:
if (t) ret.push_back(t);
- 高精度除法:
不需要处理
- 消去前导零的方式不同:
- 高精度乘法:
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
具体过程:
- 初始时,差分数组
b
的所有元素都是0
- 对于每个
i
(从1
到n
),执行insert(i, i, a[i])
:
b[i] += a[i]
:将a[i]
的值赋给b[i]
b[i + 1] -= a[i]
:将a[i]
的值从b[i + 1]
中减去- 最终,差分数组
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; }
b[l] += c
:
- 表示从位置
l
开始,每个元素都加上c
- 这是因为差分数组
b
的前缀和会累加b[l]
,从而影响从l
开始的所有元素。
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] += 2
,b
变为[1, 3, 1, 1, 1]
。b[5] -= 2
,b
变为[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.高精度加法题目介绍方法一:代码片段解释片段一: 解题思路分析 792. 高精度减法题目介绍方法一:代码片段解释片段一: 解题思路分析 7…...
C语言深度解析:从零到系统级开发的完整指南
一、C语言的核心特性与优势 1. 高效性与直接硬件控制 C语言通过编译为机器码的特性,成为系统级开发的首选语言。例如,Linux内核通过C语言直接操作内存和硬件寄存器,实现高效进程调度。 关键点: malloc/free直接管理内存&#…...
Axure疑难杂症:完美解决中继器筛选问题(时间条件筛选、任性筛选)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:中继器筛选专题 主要内容:时间条件筛选、多条件组合筛选、多个单一条件混合筛选 应用场景:各类数据表的多条件筛选均可使用…...
汇编学习之《扩展指令指针寄存器》
什么是指令指针寄存器? EIP (Extended Instruction Pointer): 保存cpu 下一次将要执行的代码的地址。 通过OllyGbd可以看到CPU即将执行指令的地址和EIP 内部放入的地址一致,多次F8依然是这样。 这里要区分下,之前比如EAX,ECX我…...
oracle-blob导出,在ob导入失败
导出: [oraclelncs dmp]$ /home/oracle/sqluldr2 gistar/res#pwd192.168.205.58:1521/lndb query"select * from an_odn_picture where length(PIC_CONTENT)<25000" filean_odn_picture.csv Charsetutf8 textCSV 0 rows exported at 2025-…...
【Linux笔记】进程间通信——匿名管道||进程池
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】动态库与静态库的理解与加载 🔖流水不争,争的是滔滔不 一、Linux进程间通…...
Spring Boot 3.4.3 基于 Caffeine 实现本地缓存
在现代企业级应用中,缓存是提升系统性能和响应速度的关键技术。通过减少数据库查询或复杂计算的频率,缓存可以显著优化用户体验。Spring Boot 3.4.3 提供了强大的缓存抽象支持,而 Caffeine 作为一款高性能的本地缓存库,因其优异的…...
windows使用nvm管理node版本
1.下载地址:https://github.com/coreybutler/nvm-windows/releases 选择nvm-setup.exe 2.安装,下载完成后,以管理员身份运行 nvm-setup.exe,选择默认安装,一路next 3.使用,安装完成后会打开一个命令行窗口࿰…...
vscode集成deepseek实现辅助编程(银河麒麟系统)【详细自用版】
针对开发者用户,可在Visual Studio Code中接入DeepSeek,实现辅助编程。 可参考我往期文章在银河麒麟系统环境下部署DeepSeek:基于银河麒麟桌面&&服务器操作系统的 DeepSeek本地化部署方法【详细自用版】 一、前期准备 (…...
智谱大模型(ChatGLM3)PyCharm的调试指南
前言 最近在看一本《ChatGLM3大模型本地化部署、应用开发和微调》,本文就是讨论ChatGLM3在本地的初步布设。(模型文件来自魔塔社区) 1、建立Pycharm工程 采用的Python版本为3.11 2、安装对应的包 2.1、安装modelscope包 pip install model…...
MySQL GROUP BY分组获取非聚合列值方法
在使用MySQL进行数据库查询时,如果你需要对数据按照某个或某些列进行分组(GROUP BY),并且希望在结果中包含非聚合列的值,你可以通过以下几种方法来实现: 1. 使用聚合函数 虽然这不是直接获取非聚合列值的…...
多路径 TCP 调度的另一面
参考前面的文章 一个原教旨的多路径 TCP 和 MP-BBR 公平性推演,一直都破而不立,不能光说怎样不好,还得说说现状情况下,该如何是好。 如果 receiver 乱序重排的能力有限(拜 TCP 所赐),如果非要在多路径上传输 TCP&…...
在Qt中判断输入的js脚本是否只包含函数
目前在使用QtScriptEngine,在利用evaluate注册子函数时,要求用户输入的js文件中的内容仅仅是函数,函数体外不能出现一些变量的声明、函数的调用等其他代码。 反复咨询DeepSeek后,终于给出了一个目前测试可用的代码: b…...
【Easylive】MySQL中LEFT JOIN与INNER JOIN的使用场景对比
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 在MySQL数据库查询中,JOIN操作是最常用的操作之一,而LEFT JOIN和INNER JOIN是两种最基础的JOIN类型。理解它们的区别和适用场景对于编写高效、准确的SQL查询至关重要…...
Boost库中的谓词函数
Boost库中的谓词函数 谓词函数基础概念 在编程中,谓词函数(Predicate Function)是指返回布尔值(true或false)的函数,用于检测输入是否满足特定条件。谓词函数在STL算法和Boost库中被广泛使用,…...
人工智能之数学基础:基于初等反射矩阵完成矩阵的QR分解
本文重点 QR分解是矩阵分解中的一种重要方法,它将一个矩阵分解为一个正交矩阵Q和一个上三角矩阵R的乘积,即A=QR。这种分解在求解线性方程组、最小二乘问题、特征值计算等领域有着广泛应用。 QR分解的定义 QR分解就是应用了初等反射矩阵,不断的通过初等反射矩阵,然后将A变…...
AI应用案例(1)——智能工牌和会话质检
今天开辟一个新的模块,自己平时也搜集一些典型的行业应用案例,不如就记录到C站,同时和大家也是个分享好了。 今天分享的企业和产品,是循环智能的智能工牌。 这个产品应用场景清晰,针对的行业痛点合理,解决…...
碰一碰发视频系统--基于H5场景开发
碰一碰发视频#碰一碰发视频#开发基于H5的"碰一碰发视频"交互系统(类似华为/苹果的NFC碰传但通过移动端网页实现),需要结合近场通信(NFC/H5 API)和媒体传输技术。以下是具体实现方案 #碰一碰营销系统# #碰一…...
kotlin扩展函数的实现原理
1. 编译时转换 在编译时,Kotlin 扩展函数会被转换为静态函数。这个静态函数的第一个参数是接收者类型(也就是被扩展的类),而调用扩展函数时,实际上是调用这个静态函数,并将接收者对象作为第一个参数传入。…...
激活函数学习笔记
Sigmoid:梯度消失、指数计算复杂运行慢、输出不是以0为中心,梯度平滑便于求导tanh:以0为中心,其他与sigmoid相似ReLu:transformer常用,解决了梯度消失问题、计算复杂度低,存在神经元死亡问题和梯…...
【含文档+PPT+源码】基于Python爬虫二手房价格预测与可视化系统的设计与实现
项目介绍 本课程演示的是一款基于Python爬虫二手房价格预测与可视化系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项…...
基于 Swoole 的高性能 RPC 解决方案
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
# 实时人脸识别系统:基于 OpenCV 和 Python 的实现
实时人脸识别系统:基于 OpenCV 和 Python 的实现 在当今数字化时代,人脸识别技术已经广泛应用于各种场景,从手机解锁到安防监控,再到智能门禁系统。今天,我将通过一个完整的代码示例,详细讲解如何使用 Pyt…...
python的global在编译层面的进阶理解
目录 报错情况 编译执行过程 (1)源代码(.py 文件) (2)编译阶段:解析 & 生成字节码 (3)解释执行:Python 虚拟机(PVM) 字节码…...
OpenCV、YOLO与大模型的区别与关系
OpenCV、YOLO 和大模型的区别与关系 1. OpenCV(Open Source Computer Vision Library) 定位:开源的计算机视觉基础库。功能:提供传统的图像处理算法(如图像滤波、边缘检测、特征提取)和基础工具ÿ…...
Buzz1.2.0视频语音转成TXT、SRT、VTT工具
buzz0.9.0.exe下载 https://download.csdn.net/download/u011000529/90551347 特征 导入音频和视频文件并导出文本到 TXT、SRT 和 VTT从您计算机的麦克风转录和翻译成文本(资源密集型且可能不是实时的,Demo)支持Whisper、 Whisper.cpp、Fast…...
Vue 2 和 Vue 3 中的钩子函数
Vue 钩子函数也被叫做生命周期钩子函数,它是 Vue 实例在其生命周期的不同阶段自动调用的函数。可以利用这些钩子函数在特定阶段执行自定义代码。 Vue 2 生命周期钩子函数 在 Vue 2 里,生命周期钩子函数可以在组件选项对象中定义。下面是一个简单的 Vue…...
零基础如何学会Appium自动化测试?
前言 appium是一款移动自动化测试工具,经常被用于实现UI自动化测试,其可支持安卓和IOS两大平台,还支持多种编程,因而得到了广泛的应用。此处便是立足于安卓平台,借助appium工具,使用python语言实现简单的自…...
用Python实现TCP代理
依旧是Python黑帽子这本书 先附上代码,我在原书代码上加了注释,更好理解 import sys import socket import threading#生成可打印字符映射 HEX_FILTER.join([(len(repr(chr(i)))3) and chr(i) or . for i in range(256)])#接收bytes或string类型的输入…...
SQL复杂查询与性能优化:医药行业ERP系统实战指南
SQL复杂查询与性能优化:医药行业ERP系统实战指南 一、医药行业数据库特性分析 在医药ERP系统中,数据库通常包含以下核心表结构: -- 药品主数据 CREATE TABLE drug_master (drug_id INT PRIMARY KEY,drug_name VARCHAR(255),specification …...
问题大集10-git使用commit提交中文显示乱码
(1)问题 (2)解决步骤 1) 设置全局编码为 UTF-8 git config --global core.quotepath false git config --global i18n.commitEncoding utf-8 git config --global i18n.logOutputEncoding utf-8 2) 显示或设…...
vue前端项目技术架构(第二版)
vue技术架构介绍 如下图所示,展示了项目系统的软件层次架构。该系统采用基于SOA(面向服务架构)思想的分层架构,分为四个主要层次:视图层、编译层、代码层和数据层。 视图层 浏览器:核心职责是解析并展示…...
Java 开发中的 AI 黑科技:如何用 AI 工具自动生成 Spring Boot 项目脚手架?
在 Java 开发领域,搭建 Spring Boot 项目脚手架是一项耗时且繁琐的工作。传统方式下,开发者需要手动配置各种依赖、编写基础代码,过程中稍有疏忽就可能导致配置错误,影响开发进度。如今,随着 AI 技术的迅猛发展&#x…...
计算机网络知识点汇总与复习——(一)计算机网络体系结构
Preface 计算机网络是考研408基础综合中的一门课程,它的重要性不言而喻。然而,计算机网络的知识体系庞大且复杂,各类概念、协议和技术相互关联,让人在学习时容易迷失方向。在进行复习时,面对庞杂的的知识点,…...
Copilot完全指南:AI编程助手的革命性实践
一、智能编程新时代:从代码补全到AI结对编程 1.1 Copilot的进化历程 2021年GitHub Copilot的诞生标志着编程辅助工具进入新纪元。与传统IDE补全工具相比,Copilot展现出三大革命性特征: 语义理解:基于GPT模型理解代码上下文跨文…...
Redis 梳理汇总目录
Redis 哨兵集群(Sentinel)与 Cluster 集群对比-CSDN博客 如何快速将大规模数据保存到Redis集群-CSDN博客 Redis的一些高级指令-CSDN博客 Redis 篇-CSDN博客...
5、无线通信基站的FPGA实现架构
基站(Base Station,BS),也称为公用移动通信基站,是无线电台站的一种形式,具体则指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间的信息传递的无线电收发信电台。…...
MySQL - 索引原理与优化:深入解析B+Tree与高效查询策略
文章目录 引言一、BTree索引核心原理1.1 索引数据结构演化1.2 BTree的存储结构通过主键查询(主键索引)商品数据的过程通过非主键(辅助索引)查询商品数据的过程 MySQL InnoDB 的索引原理 二、执行计划深度解析三、索引失效的六大陷…...
2025年数智化电商产业带发展研究报告260+份汇总解读|附PDF下载
原文链接:https://tecdat.cn/?p41286 在数字技术与实体经济深度融合的当下,数智化产业带正成为经济发展的关键引擎。 从云南鲜花产业带的直播热销到深圳3C数码的智能转型,数智化正重塑产业格局。2023年数字经济规模突破53.9万亿元ÿ…...
html实现手势密码
<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>手势密码</title><style>body {font-fam…...
机器学习(八):K-Means聚类原理与实战
声明:未经允许禁止转载与抄袭。 前言 k k k均值( k k k-means)聚类算法是一种经典的无监督聚类算法,本文将深入解析其理论原理,并在真是数据集上进行算法实践,话不多说,请看下文。 算法原理 …...
从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换
从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中,我们经常需要将 Word 文档转换为 HTML,用于…...
SQLMesh调度系统深度解析:内置调度与Airflow集成实践
本文系统解析SQLMesh的两种核心调度方案:内置调度器与Apache Airflow集成。通过对比两者的适用场景、架构设计和操作流程,为企业构建可靠的数据分析流水线提供技术参考。重点内容包括: 内置调度器的轻量级部署与性能优化策略Airflow集成的端到…...
【深度学习新浪潮】Grok过去两周的进展一览(2025.04.01)
1. Grok过去两周的进展一览 根据公开信息,Grok在过去两周的主要进展如下: Grok 3正式上线并开放 xAI于2025年3月30日宣布Grok 3正式向所有Premium+订阅用户开放,并同步将X平台的Premium+订阅费用上涨至月费近50美元、年费350美元。这是继Grok 2之后的重大升级,其推理能力和…...
Vue表单数据回显失败技术解析与修复指南!!!
Vue表单数据回显失败技术解析与修复指南 🚀 在Vue.js应用开发中,「父子组件通信」「动态弹窗」是经典功能组合。但当遇到关键场景表单数据无法回显时,你是否也在深夜加班改bug?本文通过完整案例分析,揭秘该问题背后深层…...
【Office办公】【Excel】VLOOKUP函数-高速查找指定匹配数据,可合并2个表格
VLOOKUP 是 Excel 中常用的查找函数,用于在表格或区域中按列查找特定值并返回对应行的其他列数据。以下是详细使用方法及注意事项: 函数语法 VLOOKUP(查找值, 表格范围, 列索引号, [匹配方式])查找值:要查找的值(如单元格引用或…...
Java基础-21-基本语法-封装
封装(Encapsulation) 1. 什么是封装? 封装(Encapsulation)是面向对象编程(OOP)中的一个重要特性。它指的是将对象的属性和行为封装在一个类中,并提供访问控制机制,防止…...
SpringCloud概述
Spring Cloud Alibaba 1 系统架构演进 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。 1.1 单体架构 早期的软件系统通常是基于单体应用架构设计的,也就是将整个系统作为一个单一的…...
Kafka中的消息是如何存储的?
大家好,我是锋哥。今天分享关于【Kafka中的消息是如何存储的?】面试题。希望对大家有帮助; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中,消息是通过 日志(Log) 的方式进行存储的。…...
主流Web3公链的核心区别对比
以下是当前主流Web3公链的核心区别对比表,涵盖技术架构、性能、生态等关键维度: 特性以太坊 (Ethereum)SolanaBNB ChainPolygonAvalanche共识机制PoS(信标链分片)PoH(历史证明) PoSPoSA(权益证…...