前缀和算法篇:解决子数组累加和问题
前缀和算法篇:解决子数组累加和问题
1.前缀和原理
那么在介绍前缀和的原理之前,那么我们先来说下前缀和最基本的一个应用场景,那么就是如我们标题所说的子数组累加和问题,那么假设我们现在有一个区间为[L,R]的数组,那么我们要求的其中子数组比如[L,i]或者[i,m] (L<=i<=m<=R)的累加和,那么我们最暴力的方法就是遍历一遍数组的子区间累加得到该子数组的累加和,那么我们每次求出一个累加和那么也就意味着要遍历一次数组,那么我们能否以一个较小的代价就能够得到子数组的累加和,那么这就是我们前缀和所应用的一个最基本的场景。
假设我们有了左边界L(或者说数组下标为0的位置)到这个数组中任意位置i的一个累加和,那么我们计算其中的子数组比如[i,m] (i<m)的累加和,那么我们只需要L到i的累加和sum1,以及L到m的累加和sum2,那么我们用sum2-sum1则是我们子数组[i.m]的累加和,那么这就是我们前缀和得到子数组累加和的一个原理
那么我们根据这个原理,如果我们加载一个前缀和数组sum,该数组的每一个的位置表示从左区间L到该位置的累加和,那么有了这个数组之后,我们可以计算区间[L,R]中任意一个子数组[i,m] (i<=m)的累加和假设其累加和为ant,那么公式则是ant=sum[m]-sum[i-1]。
所以现在的关键就是我们怎么得到前缀和数组,那么我们可以采取一个递推的思路加载我们的前缀和数组sum,那么最开始我们肯定只有左区间L到L的前缀和,它的前缀和就是数组下标为0的值,然后我们要扩展L到1的前缀和,那么我们就通过前面计算好的L到L的前缀和加上arr[1]的值就是L到1,那么计算L到2,那么我们手上有计算好的L到1的前缀和,那么我们在这个L到1的前缀和的基础上加上arr[2],那么同理现在要计算L到i位置,那么就用sum[i-1]+arr[i]即可,所以我们的代码实现可以采取一个循环的方式来得到我们的前缀和数组中的每一个位置的值。
但是这里我们知道我们计算[i,m] (i<=m),我们公式是sum[m]-sum[i-1],那么我们知道在数组中我们的左边界L就是为0,那么我们如果要计算[L,i]的累加和的话,那么公式就是sum[i]-sum[L-1],而这里L是0,那么L-1就是-1,可是对于数组来说,访问不到下标为-1的前缀和数组,所以这里为了处理边界,我们会将区间[L,R]整体往右平移一个单位[L+1,R+1],也就是说在加载我们的前缀和数组的时候,我们理解为我们的原数组内容的开头的左侧多出了一个0,然后再加载我们的前缀和数组,这样[L,i]的累加和就是sum[i+1]-sum[L]
代码模版:
#include<iostream>
#include<vector>
using namespace std;
#define N 8
int main()
{vector<int> arr={0,1,2,3,4,5,6};vector<int> sum(N,0);for(int i=1;i<sum.size();i++){sum[i]=sum[i-1]+arr[i-1];}return 0;
}
2.前缀和应用
题目一:求子数组累加和 难度:EZ
题目:现在给你一个数组,数组中的元素有正有负,让你求其中区间为[L,R]的子数组的累加和。
题目思路:那么这个题就是我们上文所说的前缀和最基本的应用场景,纯纯模版题,那么就套我们的模版来做即可
代码实现:
class solution
{int count(vector<int>& arr,int l,int r){vector<int> sum(arr.size()+1,0);for(int i=1;i<sum.size();i++){sum[i]=sum[i-1]+arr[i-1];}return sum[r+1]-sum[l];}
}
题目二:求累加和为aim的最长子数组 难度:MID
题目:现在给一个数组,数组中的元素有正有负,那么我们要求这个数组中累加和为aim,并且最长的子数组,返回这个最长子数组的长度。
题目思路:那么这里我们要求累加和为aim且长度最长的子数组,那么这里我们看到有关于子数组问题的,那么一定就要敏感,因为子数组意味着连续区间,那么它可以应用我们的滑动窗口或者前缀和,但是具体题目得具体分析。
那么这里我们可以这样想,假设我们这个数组的整体的区间为[L,R],那么我们就求这个区间上每一个位置i,求以该位置作为子数组结尾往左延伸的并且累加和为aim的子数组的最长长度,那么我们有了每一个位置以该位置结尾的子数组的最长长度,那么我们在综合每一个位置的长度得到最长的,那么这个最长的长度就是我们整个区间[L,R]所能够得到的累加和为aim的最长子数组长度。
那么现在问题就变为了我们怎么求每个位置的以该位置结尾的累加和为aim的最长子数组呢?那么我们可以首先加载一个该数组的前缀和数组,那么我们对于每一个L到i位置区间的前缀和,我们可以以该视角去理解该区间的前缀和
我们假设我们L到i位置区间的前缀和为sum,那么我们这里的sum前缀和可以由两部分得到,假设我们在这个L到i位置区间任取一个点位m,那么我们这里L到i区间的前缀和可以等价于L到m位置的前缀和加上我们的m到i位置累加和得到,那么我们按照这个理解的话,那么求以这个数组中任意以i位置结尾往左延伸的累加和为aim的子数组,我们可以看成我们L到i区间的前缀和sum是由以该i位置结尾往左延伸到m位置的累加和aim加上L到m的前缀和sum-aim得到,那么我们要往左延伸的更长,那么意味着我们的前缀和sum-aim的长度就得更短,那么所谓更短就是我们这个前缀和sum-aim出现的位置更靠前,那么我们就可以从左往右加载我们的前缀和数组的时候同时通过一个哈希表其中key是前缀和,value值是该前缀和第一次出现从左侧第一次出现的位置,那么这个位置就是我们sum-aim最靠前的位置
那么由于我们是在加载我们前缀和的同时,计算好我们当前i位置的前缀和后如果是以第一次出现的话立马会添加进哈希表当中计算好i位置的前缀和,那么我由于我们是从左往右加载我们的前缀和同事将计算好的前缀和添加到哈希表中,那么也就意味着我们此时在哈希表中记录的第一次出现的前缀和的位置一定是在i位置的左侧而不是右侧,因为我们还未计算i位置右侧的前缀和,所以我们计算好i位置的前缀和,然后立马查询哈希表计算出该位置往左延伸累加和为aim的最长子数组,然后在每个位置综合得到整个区间累加和为aim的最长子数组。
代码实现:
class Solution
{
public:// 计算数组中累加和为aim的最长子数组的长度int count(vector<int>& arr, int aim){vector<int> sum(arr.size() + 1, 0); // 前缀和数组,大小比原数组多1int ans = 0; // 存储最长子数组的长度unordered_map<int, int> value; // 哈希表,存储前缀和及其首次出现的索引value[0] = 0; // 初始化哈希表,前缀和为0时的索引为0for (int i = 1; i < sum.size(); i++){sum[i] = sum[i - 1] + arr[i - 1]; // 计算前缀和// 如果当前前缀和已经存在于哈希表中,更新其索引为最新位置// 但实际上,我们不需要更新,因为我们只关心第一次出现的位置// 检查是否存在前缀和为sum[i] - aim的索引if (value.find(sum[i] - aim) != value.end()){// 如果存在,计算当前子数组的长度,并更新最长长度ans = max(ans, i - value[sum[i] - aim]);}// 如果当前前缀和不在哈希表中,则添加进去if (value.find(sum[i]) == value.end()){value[sum[i]] = i;}}return ans;}
};
题目三:求子数组累加和为aim的个数 难度:MID
题目:现在我们有一个数组,那么我们要求这个数组中子数组累加和为aim的个数。
题目思路:那么在上一个题目,我们就说了,我们一个区间为[L,R]的一个数组的累加和假设为sum,那么它的累加和可以看做我们前缀和L到i位置的累加和加上i到R位置的累加和,那么这里我们的思路就是求这个数组中每个位置结尾往左延伸累加和为aim的数量,然后累加每个位置得到以该位置结尾的累加和为aim的数量就是我们整个数组累加和为aim的子数组的数量。
那么我们求每个位置i以该位置结尾的累加和为aim的数量,那么我们知道L到i区间的前缀和sum可以看做由L到m位置的前缀和加上m到R位置的前缀和,那么我们这里统计我们在L到i位置处的前缀和为sum-aim的数量有多少个,那么就可以得到以i位置为结尾的累加和为aim的子数组有多少个
那么我们实现则是在加载前缀和的同时记录我们的哈希表,我们哈希表则记录前缀和出现的次数,那么我们在从左往右加载我们前缀和数组的同时,然后计算该位置处的累加和为aim的子数组的数量,因为我们是从左往右遍历数组,然后更新我们的哈希表,那么此时记录在哈希白中的各种前缀和出现的次数一定都是在i位置之前的,因为i位置之后的前缀和我们还未被记录到哈希表当中去,所以我们边加载我们的前缀和数组,边查询我们的哈希表得到每个位置以该位置结尾的累加和为aim的子数组的数量
代码实现:
class Solution
{
public:// 计算数组中子数组累加和为aim的个数int count(vector<int>& arr, int aim){vector<int> sum(arr.size() + 1, 0); // 前缀和数组,大小比原数组多1int ans = 0; // 存储满足条件的子数组个数unordered_map<int, int> value; // 哈希表,存储前缀和及其出现次数value[0]++; // 初始化哈希表,前缀和为0的初始出现次数为1for (int i = 1; i < sum.size(); i++){sum[i] = sum[i - 1] + arr[i - 1]; // 计算当前位置的前缀和// 在更新哈希表之前,先查询是否存在前缀和为sum[i] - aim// 如果存在,说明从某个位置到当前i位置的子数组累加和为aimans += value[sum[i] - aim];// 更新哈希表中当前前缀和的出现次数value[sum[i]]++;}return ans;}
};
题目四:求正负数相等的子数组的最大长度 难度:MID
题目:我们现在会有一个数组,那么这个数组的元素包含正负数以及零,那么我们要求求出满足正数的数量与负数的数量相等的子数组的最长长度。(注:这里只关心正数与负数是否相等,不算数值0哦)
例:[12,-1,-6,0,3,6]
其中最长子数组是区间为[0,4]的子数组[12,-1,-6,0,3]以及区间[1,5]的子数组[-1,-6,0,3,6],长度都为5
题目思路:那么这里我们分析题意,那么这里我们只要寻找正数以及负数数量相等的子数组,那么这道题的关键就是我们不关心这个数组中各个数的数值而只关心该数的一个状态是正数还是负数还是0,所以我们就得将我们的原数组首先给预处理一下,我们原数组的各个数值的正数比如12或者6,那么在这道题中无论他的数值在大或者在小,那么他们都是同一类数,也就是正数,所以我们预处理得到的数组只有这个数的状态信息没有数值信息,所以我们这里将我们的正数转换为1,负数转换为-1,0就是0,比如原数组为[12,-1,-6,0,3,6],那么经过预处理之后得到数组是[1,-1,-1,0,1,1],那么我们接着对预处理数组加载一个前缀和数组
那么该对于区间[L,R]的数组来说,如果该位置i的前缀和为0,那么说明该区间的正负数的数量相等,整个区间就记录答案,,若位置i的前缀和不为0,那么说明这个区间[L,i]中的数的分布是负数是不等于正数的,那么也就是说我们该区间中还有可能有正负数的数量相等的区间存在,因为我们知道一个区间[L,R]的前缀和可以由区间[L,m]的前缀和加上[m,R]的前缀和,所以我们这里的思路就是求每个位置以该位置为结尾往左延伸满足正数的数量等于负数的数量的最长子数组,那么最后我们求得每个位置满足要求的最长长度,那么综合就得到整个区间满足要求的最长子数组长度
所以这里如果我们的i位置的前缀和不为0,假设i位置的前缀和为sum,那么我们找在i位置之前的前缀和为sum出现的最靠前的位置,因为sum+0=sum,那么找到i位置之前最靠前的sum位置m,那么m到i的累加和就是0,那么就是以i位置结尾往左延伸的正负数数量相等的最长子数组
所以我们在加载我们的前缀和数组的时候同时将每个前缀和第一次出现的位置记录在我们的哈希表,那么我们在加载计算出我们该i位置的前缀和的同时,那么我们查询我们的哈希表,那么此时哈希白记录的是前缀和第一次出现的位置,由于我们是从左往右加载前缀和数组的同时查询我们的哈希表,那么我们这里i位置右侧位置的前缀和都还未被计算添加哈希表中,所以意味着我们在哈希表当中记录的第一次出现的前缀和都是在i位置的左侧的,所以我们就可以查询得到我们以i位置结尾的满足要求的最长子数组,综合每个位置得到答案,那么该题经过预处理之后就和第二题是一样的了。
代码实现:
class Solution
{
public:int count(vector<int>& arr){// 预处理数组,将正数转为1,负数转为-1,零保持为0for (int i = 0; i < arr.size(); i++){if (arr[i] > 0){arr[i] = 1;}else if (arr[i] < 0){arr[i] = -1;}// 零保持为0,不需要显式处理}vector<int> sum(arr.size() + 1, 0); // 前缀和数组,大小比原数组多1int ans = 0; // 存储最长子数组长度unordered_map<int, int> value; // 哈希表,存储前缀和及其首次出现的位置value[0] = 0; // 初始化,前缀和为0的初始位置为0for (int i = 1; i < sum.size(); i++){sum[i] = sum[i - 1] + arr[i - 1]; // 计算当前位置的前缀和// 如果当前前缀和已经在哈希表中,则更新最长子数组长度// 如果 sum[i] 已经存在,则不更新 value[sum[i]],以保持最左边的位置if (value.find(sum[i]) == value.end()){value[sum[i]] = i; // 记录前缀和首次出现的位置}// 检查是否存在前缀和为 -sum[i],即 sum[i] + (-sum[i]) = 0// 这意味着从 value[-sum[i]] 到 i 的子数组满足条件if (value.find(-sum[i]) != value.end()){ans = max(ans, i - value[-sum[i]]);}}return ans;}
};
题目五:求表现良好的最长时间段 难度:MID
题目:那么这里我们会给一个数组,数组的每一个元素代表着员工当天工作一个时间,数值都是非负数,那么如果当天工作时间大于8小时的话就是疲劳的一天,如果小于等于8就是精神良好的一天,那么良好的时间段就是在该时间段内精神良好的一天的数量大于疲劳的一天的数量,求良好时间段的最长长度是多少。(注:时间段必须是连续的)
例:[10,10,10,9,1,1]
表现良好的最长时间段是[9,1,1],长度是3
题目思路:那么这道题的话,还是跟上一道题一样,那么这里我们不同数值的数中共就可以分为两个状态,分别是疲劳以及精神良好,那么我们还是得预处理我们的数组,将大于8的数转换为-1,小于等于8的数转换为1
那么对于任意位置i来说,如果该位置的前缀和大于等于1,那么说明在L到i这个区间中数的分布是正数大于负数,那么整个区间就到达标,那么如果说我们的前缀和是小于等于0的,那么说明负数的数量是大于等于我们的正数的,那么这个区间是有正数的数量大于负数的数量的可能的,那么这里假设i位置的前缀和为sum,那么找到sum-1出现的最早位置即可
那么假设i位置的前缀和是-3,那么我们要在的则是-4出现的最早位置,那么这里就会产生一个疑问为什么不找我们-5以及-6前缀和出现的最早位置呢,那么这里就是本题目的一个难点,**我们知道我们经过预处理之后的数组的数值只有1和-1两种,所以一个前缀和只能一点一点的增加和减少,所以要得到我们的前缀和-5,那么它一定是在它之前有一个右侧前缀和为-4在其右侧加了一个累加和为-1的区间才能达到前缀为-5,那么同理要得到前缀和为-6,那么得到-6之前也得有一个前缀和为-5在其右侧要加一个累加和为-1的区间,那么也就意味这我们我们最早出现前缀和为-5的区间一定是在最早出现前缀和为-4的区间的右侧,同理最早出现前缀和为-6的区间一定出现在最早出现的前缀和为-5的区间的右侧,**那么我们现在只需要以i位置为结尾往左延伸的正数数量大于负数数量的最长子数组,那么该最长子数组的累加和一定是大于等于1,那么我们就只需要找到sum-1的前缀和出现的最早位置,在我们刚才的例子中,i位置的前缀和为-3,那么我们找前缀和为-4出现的最早位置,那么至于这么找前面的题我们已经说了用我们的哈希表,那么这里我就不再赘述了,直到把刚才加粗的内容想通,那么这个题的难点就被解决了。
代码实现:
class Solution {
public:int longestGoodPeriod(vector<int>& hours) {// 预处理数组,将大于8小时的工作时间转换为-1,小于等于8小时的工作时间转换为1vector<int> transformed(hours.size());for (int i = 0; i < hours.size(); ++i) {transformed[i] = (hours[i] > 8) ? -1 : 1;}// 前缀和数组vector<int> prefixSum(transformed.size() + 1, 0);for (int i = 1; i <= transformed.size(); ++i) {prefixSum[i] = prefixSum[i - 1] + transformed[i - 1];}// 哈希表,存储每个前缀和首次出现的位置unordered_map<int, int> prefixSumIndex;prefixSumIndex[0] = 0; // 初始化,前缀和为0的初始位置为0int maxLength = 0;// 遍历前缀和数组,寻找满足条件的最长子数组for (int i = 1; i <= transformed.size(); ++i) {int currentSum = prefixSum[i];// 如果当前前缀和减1存在于哈希表中,则计算子数组长度if (prefixSumIndex.find(currentSum - 1) != prefixSumIndex.end()) {int startIndex = prefixSumIndex[currentSum - 1];maxLength = max(maxLength, i - startIndex);}// 如果当前前缀和还未出现在哈希表中,则记录其首次出现的位置if (prefixSumIndex.find(currentSum) == prefixSumIndex.end()) {prefixSumIndex[currentSum] = i;}}return maxLength;}
};
3.结语
那么这就是本篇文章关于前缀和的所有内容,那么讲了前缀和的原理以及代码实现,还有具体的应用,那么我们知道与子数组有关的问题,那么我们可以先往前缀和方向上思考,看能不能应用。
那么如果这篇文章让你有所收获的话,那么就三连关注支持一下博主,那么我们会持续更新,请大家多多关注与支持!
相关文章:
前缀和算法篇:解决子数组累加和问题
前缀和算法篇:解决子数组累加和问题 1.前缀和原理 那么在介绍前缀和的原理之前,那么我们先来说下前缀和最基本的一个应用场景,那么就是如我们标题所说的子数组累加和问题,那么假设我们现在有一个区间为[L,R]的数组,那…...
大语言模型多代理协作(MACNET)
大语言模型多代理协作(MACNET) Scaling Large-Language-Model-based Multi-Agent Collaboration 提出多智能体协作网络(MACNET),以探究多智能体协作中增加智能体数量是否存在类似神经缩放定律的规律。研究发现了小世界协作现象和协作缩放定律,为LLM系统资源预测和优化…...
vue项目使用vite和vue-router实现history路由模式空白页以及404问题
开发项目的时候,我们一般都会使用路由,但是使用hash路由还是history路由成为了两种选择,因为hash路由在url中带有#号,history没有带#号,看起来更加自然美观。但是hash速度更快而且更通用,history需要配置很…...
【Linux】从一台windows电脑访问局域网下另一台linux电脑详细操作步骤
以下是在Windows电脑B上访问Linux电脑A的文件并使用bash终端的详细步骤: 一、在Linux电脑A上配置SSH服务(用于终端操作) 安装SSH服务 sudo apt update && sudo apt install openssh-server启动SSH服务并设置开机自启 sudo systemctl …...
Makefile的用法及算法应用
编译的过程 算法:解决特定问题的求解步骤 算法的设计 1.正确性 语法正确合法的输入能得到合理的结果对非法的输入,给出满足要求的规格说明对精心选择,甚至刁难的测试都能正常运行,结果正确 2.可读性,便于交流&…...
Elasticsearch:15 年来致力于索引一切,找到重要内容
作者:来自 Elastic Shay Banon 及 Philipp Krenn Elasticsearch 刚刚 15 岁了!回顾过去 15 年的索引和搜索,并展望未来 15 年的相关内容。 Elasticsearch 刚刚成立 15 周年。一切始于 2010 年 2 月的一篇公告博客文章(带有标志性的…...
MongoDB 扩缩容实战:涵盖节点配置、服务启动与移除操作
#作者:任少近 文章目录 一、扩容在245节点上配置配置config server:配置mongos启动config server安装工具mongosh添加245新节点到副本集配置分片副本集启动路由并分片 二、缩容Conf server上去掉server4shard上去掉server4mongos上去掉server4 一、扩容…...
Bitmap在数仓中的应用
一、背景 在数据仓库的日常工作中,我们经常需要面对海量数据的存储和高效查询问题。尤其是,当业务对性能的要求越来越高、数据量持续增长时,传统的处理方式往往显得笨拙而低效。而这时候,Bitmap(位图)作为…...
C++病毒(^_^|)(2)
第二期 声明: 仅供损害电脑,不得用于非法。损坏电脑,作者一律不负责。此作为作者原创,转载请经过同意。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook;void lrud(…...
Linux 内核架构入门:从基础概念到面试指南*
1. 引言 Linux 内核是现代操作系统的核心,负责管理硬件资源、提供系统调用、处理进程调度等功能。对于初学者来说,理解 Linux 内核的架构是深入操作系统开发的第一步。本篇博文将详细介绍 Linux 内核的架构体系,结合硬件、子系统及软件支持的…...
leetcode-495.提莫攻击
leetcode-495.提莫攻击 文章目录 leetcode-495.提莫攻击一.题目描述二.代码提交三.解释 一.题目描述 二.代码提交 #include <vector> using namespace std;int findPoisonedDuration(vector<int>& timeSeries, int duration) {int total 0;for (int i 0; i …...
mysql 参数max_connect_errors研究
1.在server端设置max_connect_errors3,超过3次连接错误就block mysql> set global max_connect_errors3; Query OK, 0 rows affected (0.00 sec) mysql> show variables like max_connect_errors; --------------------------- | Variable_name | Value…...
vscode无法ssh连接远程机器解决方案
远程服务器配置问题 原因:远程服务器的 SSH 服务配置可能禁止了 TCP 端口转发功能,或者 VS Code Server 在远程服务器上崩溃。 解决办法 检查 SSH 服务配置:登录到远程服务器,打开 /etc/ssh/sshd_config 文件,确保以下…...
sql盲注获取数据库的表名、列名和具体数据
1.时间盲注 获取表名 sql id1 AND IF(ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE table_schemaDATABASE() LIMIT 1),1,1))97, SLEEP(5), 0) 获取列名 sql id1 AND IF(ASCII(SUBSTRING((SELECT column_name FROM information_schema.col…...
清华大学新闻与传播学院沈阳团队出品的《DeepSeek:从入门到精通》104页PDF
前言 本机运行DeepSeek R1大模型文章如下: Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)【保姆级万字教程】在Windows计算机部署DeepSeek大模型,给在实验室无外网的同事们用(基于Ollama和OpenWebUI…...
使用sublime_text中,TAB键无效怎么解决???
如果你也有这样的困扰,请你跟着我下面的步骤操作 点击首选项(如下图所示) 找到下面这段代码并注释掉 { “keys”:[“tab”], “args”:{“action”:“expand_abbreviation”}, “command”:“run_emmet_action”, “context”:[ { “key”:“…...
Java IO流详解
1. IO概述 IO(Input/Output)即输入和输出,指的是设备或环境之间进行数据的输入或输出。例如,键盘是输入设备,显示器是输出设备。在Java中,输入输出问题通过流(Stream)对象来解决。以…...
智慧农业-虫害及生长预测
有害生物防控系统是一个综合性的管理体系,旨在预防和控制对人类生活、生产甚至生存产生危害的生物。这些生物可能包括昆虫、动物、植物、微生物乃至病毒等。 一、系统构成 1、监测预警系统:利用智能传感器、无人机、遥感技术等手段,实时监测…...
ASIL D要达到多少fit
ASIL(Automotive Safety Integrity Level,汽车安全完整性等级)D是ISO 26262标准中最高等级的安全要求,其对应的随机硬件故障概率目标(以FIT表示)需满足以下要求: ASIL D的FIT目标 根据 ISO 262…...
与传统光伏相比 城电科技的光伏太阳花有什么优势?
相比于传统光伏,城电科技的光伏太阳花有以下优势: 一、发电效率方面 智能追踪技术:光伏太阳花通过内置的智能追踪系统,采用全球定位跟踪算法,能够实时调整花瓣(即光伏板)的角度,确…...
2025年SEO工具有哪些?老品牌SEO工具有哪些
随着2025年互联网的发展和企业线上营销的日益重要,SEO(搜索引擎优化)逐渐成为了提高网站曝光率和流量的重要手段。SEO的工作不仅仅是简单地通过关键词优化和内容发布就能够实现的,它需要依赖一系列专业的SEO工具来帮助分析、监测和…...
深入解析与解决 Oracle 报错:ORA-29275 部分多字节字符20250213
🛠️ 深入解析与解决 Oracle 报错:ORA-29275 部分多字节字符 引言 🌟 在与 Oracle 数据库打交道的日常工作中,你是否遇到过 ORA-29275: partial multibyte character 这个令人头疼的错误?这个错误通常与字符编码、数…...
HTML应用指南:利用GET请求获取全国海底捞门店位置信息
随着新零售业态的快速发展,门店位置信息的获取变得越来越重要。作为餐饮服务行业的先锋,海底捞不仅在服务质量上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。为了更好地理解和利用这些数据,本篇文…...
数据流图和数据字典
在面向结构的分析和设计阶段,**数据流图(Data Flow Diagram, DFD)和数据字典(Data Dictionary)**是两个非常重要的工具,它们分别从不同的角度描述系统的功能和数据结构,帮助开发团队更好地理解和…...
Ubuntu 22.04 LTS 安装MinerU
1. 检测是否已安装nvidia驱动 nvidia-smi 如果看到类似如下的信息,说明已经安装了nvidia驱动,可以跳过步骤2 Note CUDA Version 显示的版本号应 > 12.1,如显示的版本号小于12.1,请升级驱动 2. 安装驱动 如没有驱动&#…...
OPEN CODER : THE OPEN COOKBOOK FOR TOP -TIER CODE LARGE LANGUAGE MODELS
Abstract 大型语言模型(LLMs)在代码领域已经成为不可或缺的工具,包括代码生成、推理任务和代理系统等多个方面。虽然开放获取的代码LLMs的性能越来越接近专有模型,但适合严格科学研究的优质代码LLMs,特别是那些具有可…...
C语言中printf()函数,格式输出符
在 C 语言中,printf() 函数的格式输出符(格式说明符)用于控制输出的格式和数据类型。以下是常见的格式说明符及其用法: 基本格式符 打印各种类型的值 格式输出符数据类型说明%dint输出有符号十进制整数%uunsigned int输出无符号…...
EasyRTC嵌入式WebRTC视频通话SDK支持Web浏览器、Linux、ARM、Android、iOS
随着互联网技术的飞速发展,实时通信(RTC)已经成为现代应用中不可或缺的一部分。无论是视频会议、在线教育、远程医疗,还是社交娱乐,实时通信技术都在其中扮演着重要角色。 然而,WebRTC技术在PC和移动端的支…...
【JS球球大作战项目实战】+在线体验
个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…...
PHP高效、轻量级表格数据处理库 OpenSpout ,很好用
OpenSpout 是一个高效、轻量级的 PHP 库,用于处理电子表格文件(如 Excel 和 CSV)。它支持读取和写入大型文件,且内存占用低。本文将详细介绍如何安装和使用 OpenSpout。 目录 安装 基本使用 高级功能 参考文档 安装 OpenSp…...
数据库第三次作业
第一题: 学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:S…...
Mac 下使用多版本 Node
一、导读 使用 n 实现 Mac 下 Nodejs 的多版本切换,需要先安装一个版本的 Node.js,然后使用 npm 安装 n,再通过 n 管理 node 的多版本切换。 二、使用 npm 全局安装 n sudo npm install -g n 三、根据需求安装指定版本的 node sudo -E n…...
【油猴脚本/Tampermonkey】DeepSeek 服务器繁忙无限重试(20250214优化)
目录 一、 引言 二、 逻辑 三、 源代码 四、 添加新脚本 五、 使用 六、 BUG 七、 优化日志 1.获取最后消息内容报错 2.对话框切换无法正常使用 一、 引言 deepseek演都不演了,每次第一次提问就正常,后面就开始繁忙了,有一点阴招全…...
安全测试|SSRF请求伪造
前言 SSRF漏洞是一种在未能获取服务器权限时,利用服务器漏洞,由攻击者构造请求,服务器端发起请求的安全漏洞,攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…...
Redisson介绍和入门使用
一、什么是Redisson? Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。 官网地址…...
TUSB422 MCU 软件用户指南
文章目录 TUSB422 MCU 软件用户指南 目录表格图表1. 介绍2. 配置2.1 通用配置2.2 USB-PD 3.0 支持2.3 VDM 支持 3. 代码 ROM/RAM 大小优化4. 通过 UART 调试4. 移植到其他微控制器 TUSB422 MCU 软件用户指南 摘要 本文档是 TUSB422 微控制器基于 Type-C 端口控制(…...
归并排序 和 七大算法的总结图
目录 什么是递归排序: 图解: 递归方法: 代码实现: 思路分析: 非递归方法: 思路: 代码实现: 思路分析: 什么是递归排序: 先将数据分解成诺干个序列࿰…...
MySQL调用存储过程和存储函数
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...
类与对象(OOP)
类(Class) 类是对象的模板或蓝图,用来描述对象的属性和行为。 动态与静态是同一张图像,最终效果也是相同 类的组成分别由: 属性(成员变量):描述对象的状态。 方法(成员方法):描述对象的行为。 构造函数:用于创建对象…...
接入 SSL 认证配置:满足等保最佳实践
前言 随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安…...
PyTorch Lightning多GPU分布式日志介绍
分布式日志是指在分布式系统中,多个节点(如多台机器或多个 GPU)协同工作时,对系统运行状态、错误信息、性能指标等进行记录的过程。在 多 GPU/分布式训练 环境下,多个进程会同时运行,普通的 print() 或 logging 可能会在所有 GPU 上重复输出,导致日志混乱。PyTorch Ligh…...
LCR 160. 数据流中的中位数
文章目录 1.题目[LCR 160. 数据流中的中位数](https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/solutions/477593/zi-jie-ti-ku-jian-41-kun-nan-shu-ju-liu-zhong-de-z/)2.思路3.代码 1.题目 LCR 160. 数据流中的中位数 **中位数 **是有序整数列表中的…...
post、get、delete、put请求
一、配置axios拦截器 // src/utils/request.js import axios from axios;// 创建 axios 实例 const instance axios.create({baseURL: https://api.example.com, // 你的 API 基础 URL//timeout: 10000, // 请求超时时间 });// 请求拦截器 instance.interceptors.request.use…...
css: 针对属性left/right/top/bottom为啥设置transition动画不起作用
如题: 在css的position中 left/right/top/bottom 这类位置属性值如果考虑使用transition来添加动画,transition它会优先考虑left/top属性,而此时transition触发需要的是数值型属性,如果设置为auto则系统会默认不考虑将位置属性添加…...
计算机网络(1)基础篇
目录 1.TCP/IP 网络模型 2.键入网址--->网页显示 2.1 生成HTTP数据包 2.2 DNS服务器进行域名与IP转换 2.3 建立TCP连接 2.4 生成IP头部和MAC头部 2.5 网卡、交换机、路由器 3 Linux系统收发网络包 1.TCP/IP 网络模型 首先,为什么要有 TCP/IP 网络模型&a…...
机器学习所需要的数学知识【01】
总览 导数 行列式 偏导数 概理论 凸优化-梯度下降 kkt条件...
ArcGISPro AA表O_Name字段 内容 复制到BB表BB字段里
import arcpy# 设置工作空间和要处理的表路径 resource_shape_table r"AA表.shp" # 源表路径 resource_assets_table r"BB表.shp" # 目标表路径# 使用 SearchCursor 读取源表中的 O_Name 字段 with arcpy.da.SearchCursor(resource_shape_table, [O_Na…...
2023-arXiv-CoT Prompt 思维链提示提升大型语言模型的推理能力
arXiv | https://arxiv.org/abs/2201.11903 摘要: 我们探讨了如何生成思维链(一系列中间推理步骤)显著提高大型语言模型执行复杂推理的能力。在三个大型语言模型上的实验表明,思维链提示提高了一系列算术、常识和符号推理任务的性…...
机器学习数学基础:21.特征值与特征向量
一、引言 在现代科学与工程的众多领域中,线性代数扮演着举足轻重的角色。其中,特征值、特征向量以及相似对角化的概念和方法,不仅是线性代数理论体系的核心部分,更是解决实际问题的有力工具。无论是在物理学中描述系统的振动模式…...
逻辑分析仪的使用-以STM32C8T6控制SG90舵机为例
STM32C8T6控制SG90舵机 1.逻辑分析仪作用 逻辑分析仪在嵌入式开发中的作用非常重要,它是开发、调试和排错过程中的一个不可或缺的工具。具体来说,逻辑分析仪的作用包括以下几个方面: 1.信号捕获和分析: 逻辑分析仪能够实时捕获多个…...