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

【算法】双指针8道速通(C++)

1. 移动零

 思路:

拿示例1的数据来举例,定义两个指针,cur和dest,cur表示当前遍历的元素dest以及之前表示非零元素

 先用cur去找非零元素,每找到一个非零元素,就让dest的下一个元素与之交换

单个交换流程

在过程中,可以将整个数组划分成三个区域

总流程:

至此就让非零元素在不改变顺序的前提下移到前面了

代码实现:

void moveZeroes(vector<int>& nums) 
{for(int dest=-1,cur=0;cur<nums.size();cur++)//dest以及以前的元素是非零元素,cur以及以后的是当前遍历元素{if(!nums[cur])//如果该位置是0,就继续找非零元素{continue;}else//否则就把非零元素交换到dest位置{dest++;int tmp = nums[dest];nums[dest] = nums[cur];nums[cur] = tmp;}}
}

2. 复写零 

思路: 

先来简单说一下暴力解法

不过这都是双指针专题了,当然还是要以双指针解法为主

这次我们定义两个指针,一个是当前遍历的元素,一个是已经处理完的元素

 

但可以发现到这里时,原本的2被覆盖成0了,导致结果出错,所以这么从前往后遍历是不行的

从后往前呢?

我们先假设知道最终结果

那对于这组数据来说,最后就只会遍历到4

也就是cur遍历到4时,dest就已经到最后了(当cur是非零元素时候,dest加一,当cur是零元素时,dest加2,所以只要数据中有0,dest就会比cur更快到达终点),

再靠现在的数据从后往前遍历(当cur为非零元素时,将arr[dest]的数据改成arr[cur],并且让cur和dest都往前走一步;当cur为零元素时,将arr[dest]和arr[dest-1]的数据都改成0,并且让cur往前走一步,dest往前走两步)

那么怎么才能让cur停止到最后一个元素的位置呢?

我们可以先让cur和dest从头走一遍,但只是单纯的走一遍,不要写入数据,否则就会把没遍历的数据复写掉,如图所示

当dest大于等于最后一个元素位置时,就退出,这样cur就停在复写零之后的最后一个位置了 

但是这样的话有一种特殊情况会出错

 可以看到,当复写零完之后的最后一个元素是0时,dest会加两次,从而导致它超出了数据的范围,到了数据范围之外的下一个位置,这样再从后往前复写时,首先就会访问到非法的数据导致出错,所以,当检测到dest==arr.size()时,应先完成这一次的复写操作,避免以后出错

if(dest==arr.size())
{dest--;//让dest不会非法访问arr[dest--]=0;//复写操作之后再让dest-1,这样后面才可以正常的从后往前复写cur--;//该位置已经复写完毕,所以--
}

代码实现:

void duplicateZeros(vector<int>& arr) 
{int cur = 0,dest = -1;while(1){if(!arr[cur])//如果该元素是零dest+=2;//让dest向后移动两位else//如果不是零dest++;//就向后移动一位if(dest >= arr.size()-1)//如果dest已经到底了,就跳出break;cur++;//如果还没到底,就继续判断(这里把cur写在判断的下面,可以防止cur最后多加一位)}if(dest==arr.size())//如果dest最后在数组以外的下一个元素位置,就代表最后一次加了两次,那最后一个数就是0{dest--;arr[dest]=0;//但我们这里只需要弄一个0就行(因为第2个0在数组外面)cur--;dest--;}while(cur>=0)//从右往左覆盖,就不用担心覆盖了还没读的数据了{if(!arr[cur])//如果该元素是0,就覆盖两次{arr[dest--]=0;arr[dest--]=0;cur--;}else//否则覆盖一次{arr[dest--]=arr[cur--];}}
}

3. 快乐数

思路:

 先来看题目的示例2,把它的运算轨迹写下来就是这样

那这组数有什么规律呢?

  从第二次4出现时,后面的轨迹就完全重复

所以我们可以把它简写成这样

这不就是一个环形链表吗?没错,那4就是入环的值

那示例1可以不可以写成环形链表的形式呢?

1的各个位数的平方和还是1,所以对于快乐数而言,它的环就都是1 

如果对环形链表不熟悉,可以看我的这篇文章

 力扣题目分享:LCR 022.环形链表II(C语言)

为什么我这么能确认它一定是一个循环?而不是像无理数那样的无限不循环?

因为题目中说了,如果不会变为1,就是无限循环的数据

那如果它不是无限循环的数据,我们还有没有别的办法使得避免陷入死循环?

如图所示,即使题目没有说必定会是循环,我们也可以通过计算推出来一个快乐数最多只会运行811次平方和 

先来模拟一下示例一(是快乐数)的轨迹

 那不是快乐数的轨迹是怎么样的呢?下面来模拟一下示例二

 代码实现:

int LL(int n)//返回一个数的每个位置上的数字的平方和
{int sum = 0;while(n){sum+=(n%10)*(n%10);n/=10;}return sum;
}
bool isHappy(int n) 
{int fast = n,slow = n;//快慢指针,快指针走两次,慢指针走一次while(1)//照题目的意思(无限循环),即终究会重复(和环形链表的思想相似){fast = LL(fast);//快指针走两步fast = LL(fast);//fast = LL(LL(fast));//这样也可以slow = LL(slow);//,慢指针走一步if(fast == slow)//如果他们相遇了{if(fast == 1)//并且相遇的位置的值是1return true;//就代表是快乐数elsereturn false;//否则就不是}}
}

4.盛最多水的容器

 思路:

如果是暴力解法的话,相信大家都能写出来,无非是两层for循环嵌套,但这样是过不了的,因为O(N^2)太大了

拿示例一来举例,定义两个变量,left和right,分别指向当前数组中最左边和最右边的值

那现在如果拿height[left]height[right]充作左边和右边的长,那这个容器最大能盛的水的高度就是较小的那一边(木桶效应),宽就是left和right之间的距离

算完之后,left和right应该如何移动呢?
如果让right向左移动会发生什么?

此时容器的高度是多少呢?好像还是上一次的height[left],但宽度相比上次要少了1,那整体的容量就是减小了,也就是说,不管想左移后的right的值变没变大,整体容量都会减少,那right的值如果变小了,容量就会减的更多了

所以,第一次的容量就是固定住left的前提下能盛的最大的容量

因此,要让较小的那一边继续往中间靠拢(这样还有可能增加容量) 

也就是这样

那算完这次之后应该移动哪边呢?

因为height[right]的值较小,所以要让right--

也就是这样

不断往复,直到left>=right

看一下模拟过程

 

代码实现:

int maxArea(vector<int>& height) 
{int left = 0,right = height.size()-1;int Max = 0;//这是目前最大的盛水量while(left<right){Max = max(min(height[left],height[right])*(right-left),Max);//最大盛水量是取的当前盛水量和Max的较大值if(height[left] < height[right])//如果左边的长较小,那右边的长无论怎么往左移,盛水量都只会缩小,所以当前盛水量就是固定左边长的情况下最大的盛水量了left++;//所以要让左边的长往右移else//那如果右边的长较小,也一样right--;//所以要让右边的长往左移}return Max;
}

5.有效三角形的个数

思路: 

先复习一下判断三角形的条件:有三条边a,b,c,有a+b>c && a+c>b && b+c>a时,就可以判断这三条边可以构成三角形,但其实还有个更简单的方法

若a <= b <= c,那只需要a+b>c就可以判断这三条边可以构成三角形,因为a和b是最小的两条边,最小的两条边相加都大于最大的那条边了,那其他两条边相加肯定也会大于第三边

这也是这道题的核心思想:即在a <= b <= c的前提下,a+b>c就可以判断它是三角形

那我们就需要给这个数组定义三个指针,分别代表三条边的a,b,c,但怎么才能知道哪个数大哪个数小呢?

所以还需要先排序

排序后,最大的数就在最后了

c从后往前遍历,也就是让每个最大的数都当一遍c,然后right在max的前一个,left在第一个

为什么要这么排呢?对于当前数组来说,nums[left]+nums[right] >nums[max],所以2,3,4可以组成三角形,那既然2,3,4可以,那left+1后的的2,3,4也肯定可以(因为left一开始是在0的位置,越往后越大,最小的left都可以组成三角形了,那其他比它大的数也肯定可以了),所以这一次计算就得出了两种三角形

那下一步是移动left还是right?

上面我说过了,这一次只要能组成三角形,那left的值是(left,right-1)时的情况都成立,所以此时再让left++就没有意义了,因此要让right--

这种情况组成不了三角形,因此要让left++,去寻找更大的两条边来试

但再加left<right的条件就不成立了

所以这时max--

让right再等于max-1,left再等于0,重新上面的步骤

 代码实现:

int triangleNumber(vector<int>& nums) 
{//核心:在a<=b<=c情况下,a+b>c就可以证明是三角形sort(nums.begin(),nums.end());//先排序int max = nums.size()-1;//让从后往前来,即让最大的那个数当cint cnt = 0;for(;max>=2;max--){int left = 0,right = max - 1;//这是比c小的数的区间while(left < right){if(nums[left] + nums[right] > nums[max])//如果a+b>c,那a后面的数+b也一定>c{cnt += right - left;//加上a后面的数的次数right--;//[]+b>c的情况已经加完了,然后换一个b}else{left++;//既然a+b<=c,那a前面的数也肯定<=c了,所以换个a}}}return cnt;
}

6. 查找总价值为目标值的两个商品(原:和为s的两个数字)

思路:

先简单讲一下人人都会第一时间想到的暴力解法,在这道题来说也就是暴力枚举

拿示例2来举例

就是把全部的情况都试一遍,直到相加==target

但这样的时间复杂度是O(N^2),太大了,过不了

这时就要用到本篇主打的算法了——双指针

定义两个变量left和right,分别指向数组的第一个和最后一个元素

此时的和要大于target,那现在是要移动left还是移动right呢?

既然left现在是最小的值,那最小的值和right相加都大于target,如果让再移动,那left所指向的值不更大了吗?

所以现在要让right--

现在的和小于target了,那此时right再向左移动的话,值只会更小,所以接下来要让left++ 

因为现在的和大于target,所以此时要让right--

此时的和等于target,跳出

代码实现:

vector<int> twoSum(vector<int>& price, int target) 
{int left = 0,right = price.size()-1;//分别指向数组的第一个和最后一个while(left<right){if(price[left] + price[right] > target)//如果现在的和要比目标值要大,就要减小值,所以right--right--;else if(price[left] + price[right] < target)//如果要小,就要增大值,所以left++left++;else//如果找到了,就返回这俩数return {price[left],price[right]};}return {0,0};//照顾编译器
}

7.三数之和:

思路:

 这道题的暴力解法无非就是三重for循环,找到全部符合条件的元祖之后再用set去重,但它的时间复杂度太高了,还是直接引入本篇的主题——双指针 吧

这道题其实可以优化成上一道题(和为s的两个数字)来解,nums[i] + nums[j] + nums[k] == 0,即nums[i] + nums[j] == -nums[k],这不就是上一个题的解法吗?

排好序之后,定义三个变量,i,left,right,分别代表上述的nums[k],nums[i],nums[j],让当left和right指向的值相加等于-nums[i]时,就是一种结果

 现在就来模拟一下示例1的过程

此时,结果小于-nums[i],按照上一题的解法,就让left++以此让两者相加的值更接近-nums[i]

此时left还是-1,不管是否成立,都会重复结果,这时候就需要去重操作

因为此时的数组已经排好序了,相同的元素都挨在一起,我们可以让这三个指针在移动时直接跳过重复的元素

对于上图的案例来说,第一个-1判断完后,就应该直接让left移动到0处

中途就不断重复这样的过程,直到找到第一组案例

此时虽然是找到了一组案例,但仔细看这组案例[-1,-1,2],里面有重复的元素,是不合法的,所以去重的条件应该设为nums[i] != nums[i+1](left和right也同样适用) 

所以当i从-1开始时,left应该从0开始才对

此时大于-nums[i] ,就让right--,以缩小它们两个的和

此时终于找到了第一组合法的案例

这时要让left和right都++并且确保nums[left]和nums[right] != nums[left-1] 并且 != nums[right-1]

 当left>=right时就需要再次移动i并且确定新的left和right了

以此类推,直到i +2 >= nums.size()时,i后面就不足两个元素了,此时就不用看了

小优化:

如果三个数相加起来的和的0的话,那它们三个起码会有一个负数,那么,当i>0时,三个数就必然是正数了,此时就没有必要排序了,所以只需要遍历到i>0为止

代码实现:

vector<vector<int>> threeSum(vector<int>& nums) 
{sort(nums.begin(),nums.end());//先排序int i=0,left,right;//当nums[left] + nums[right] == -nums[i]时,他们仨相加就为0了vector<vector<int>> vv;while(i+2<nums.size())//如果i到了nums.size()-1或者-2的地方,就凑不够三个数了{while(i>0 && nums[i] == nums[i-1] && i+2<nums.size())//因为重复的元组不要,所以遍历时直接忽略重复的元素i++;int target = -nums[i];//让nums[left]+nums[right]==targetleft = i+1,right = nums.size()-1;//[left,right]就是[i+1,nums.size()-1]的区间范围while(left < right)//开始从区间内寻找==target的两个元素{if(nums[left] + nums[right] > target)//如果>target,就要缩小他们两个相加的结果,所以要让right--{right--;while(nums[right] == nums[right+1] && left < right)//因为重复的元组不要,所以遍历时直接忽略重复的元素right--;}else if(nums[left] + nums[right] < target)//如果<target,就要增大他们两个相加的结果,所以要让left++{left++;while(nums[left] == nums[left-1] && left < right)//因为重复的元组不要,所以遍历时直接忽略重复的元素left++;}else//此时nums[left]+nums[right]==target,即nums[left]+nums[right]+nums[i]==0{vector<int> v;vv.push_back({nums[i],nums[left],nums[right]});//初始化列表可以构造一个临时的vector//将left和right都往中靠齐一样right--;while(nums[right] == nums[right+1] && left < right)//因为重复的元组不要,所以遍历时直接忽略重复的元素right--;left++;while(nums[left] == nums[left-1] && left < right)//因为重复的元组不要,所以遍历时直接忽略重复的元素left++;}}i++;}return vv;
}

8. 四数之和:

思路:

这道题和上一道题可以说是师出同门,用暴力解法也就是四重循环找元组,不过既然师出同门,那当然也就意味着同样可以和上一题一样用双指针解法

我们可以先把这道题优化成三数之和

即定义一个target1 = target - nums[a],这样只要满足nums[b] + nums[c] + nums[d] == target1 即可

然后三数之和问题又可以优化成第6题两数之和

即定义一个target2 = target1 - nums[b],这样只要满足nums[c] + nums[d] == target2即可

当然,在进行这些操作前,都要先排序

拿示例1来演示

 如图所示,红色方框是一个三数之和,而三数之和里面的棕色方框就是两数之和

当然,还有去重操作,在四数之和也同样需要

即这四个变量在移动时要确保下一个元素和上一个元素不相同

代码实现:

vector<vector<int>> fourSum(vector<int>& nums, int target) 
{sort(nums.begin(),nums.end());//先排序vector<vector<int>> vv;int a,b,left,right;a=0;//第一个数,从左往右开始遍历while(a+3 < nums.size())//如果到了nums.size()-3的位置,a后面就不足3个数了,就不可能找到了{//taget1和taget2设成long long 是为了防止数据溢出long long target1 = target - nums[a];//再以target1为目标解决三数之和问题b = a + 1;//b从[a+1,nums.size()-1]遍历while(b+2 < nums.size())//如果到了nums.size()-2的位置,b后面就不足2个数了,就不可能找到了{long long target2 = target1 - nums[b];//两数之和问题left = b+1,right = nums.size()-1;//在[b+1,nums.size()-1]区间内找两数之和 == target2的元祖while(left<right){if(nums[left] + nums[right] > target2)//如果过大,就要缩小相加的和,所以right--{right--;while(left<right && nums[right] == nums[right+1])//去重操作(为了避免下一个要加的被操作数和现在的一致)right--;}else if(nums[left] + nums[right] < target2)//如果过小,就要增加相加的和,所以left++{left++;while(left<right && nums[left] == nums[left-1])//去重操作(为了避免下一个要加的被操作数和现在的一致)left++;}else{vv.push_back({nums[a],nums[b],nums[left],nums[right]});//用初始化列表插入一个vectorleft++;//找到一个元祖之后,要让left和right都++while(left<right && nums[left] == nums[left-1])//去重操作(为了避免下一个要加的被操作数和现在的一致)left++;right--;while(left<right && nums[right] == nums[right+1])//去重操作(为了避免下一个要加的被操作数和现在的一致)right--;}}b++;while(b+2 < nums.size() && nums[b] == nums[b-1])//去重操作(为了避免下一个要加的被操作数和现在的一致)b++;}a++;while(a+3 < nums.size() && nums[a] == nums[a-1])//去重操作(为了避免下一个要加的被操作数和现在的一致)a++;}return vv;
}

相关文章:

【算法】双指针8道速通(C++)

1. 移动零 思路&#xff1a; 拿示例1的数据来举例&#xff0c;定义两个指针&#xff0c;cur和dest&#xff0c;cur表示当前遍历的元素&#xff0c;dest以及之前表示非零元素 先用cur去找非零元素&#xff0c;每找到一个非零元素&#xff0c;就让dest的下一个元素与之交换 单个…...

synchronized锁

在了解锁之前我们要先了解对象布局 什么是java对象布局 在JVM中&#xff0c;对象在内存中存储的布局可以分为三块区域&#xff0c;即实例化之后的对象 对象头&#xff1a;分配的空间是固定的12Byte&#xff0c;由Mark Word&#xff08;标记字段&#xff09;和Class Pointer&…...

实训Day-2 流量分析与安全杂项

目录 实训Day-2-1流量分析实战 实训目的 实训任务1 SYN半链接攻击流量分析 实训任务2 SQL注入攻击流量分析一 实训任务3 SQL注入攻击流量分析二 实训任务4 Web入侵溯源一 实训任务5 Web入侵溯源二 ​编辑 实训Day-2-1安全杂项实战 实训目的 实训任务1 流量分析 FTP…...

LOH 怎么进行深度标准化?

The panel of normals is applied by replacing the germline read depth of the sample with the median read depth of samples with the same genotype in our panel. 1.解释: panel of normal 正常组织&#xff0c;用于识别技术噪音 germline read depth: 胚系测序深度。根…...

[预备知识]3. 自动求导机制

自动求导机制 本章节介绍 PyTorch 的自动求导机制&#xff0c;包括计算图、反向传播和梯度计算的原理及实现。 1. 计算图原理 计算图是深度学习框架中的一个核心概念&#xff0c;它描述了计算过程中各个操作之间的依赖关系。 计算图由节点&#xff08;节点&#xff09;和边…...

蓝桥杯中的知识点

总结&#xff1a; 这次考的并不理想 比赛前好多知识点遗漏 但到此为止已经结束了 mod 是 模运算&#xff08;Modulo Operation&#xff09;的缩写&#xff0c;表示求两个数相除后的 余数 10mod31 (a % b) &#xff08;7%21&#xff09; 1e9代表1乘以10的9次方&#xff0c…...

2023蓝帽杯初赛内存取证-6

这里需要用到pslist模块&#xff0c;结合一下查找关键词&#xff1a; vol.py -f memdump.mem --profile Win7SP1x64 pslist | grep -E "VeraCrypt" 将2023-06-20 16:47:41 UTC0000世界标准时间转换成北京时间&#xff1a; 答案&#xff1a;2023-06-21 00:47:41...

《MySQL 核心技能:SQL 查询与数据库概述》

MySQL 核心技能&#xff1a;SQL 查询与数据库概述 一、数据库概述1. 什么是数据库2.为什么要使用数据库3.数据库的相关概念3.1 数据库&#xff08;DB&#xff09;&#xff1a;数据的“仓库”3.2 数据库管理系统&#xff08;DBMS&#xff09;&#xff1a;数据库的“管家”3.3 SQ…...

三维几何变换

一、学习目的 了解几何变换的意义 掌握三维基本几何变换的算法 二、学习内容 在本次试验中&#xff0c;我们实现透视投影和三维几何变换。我们首先定义一个立方体作为我们要进行变换的三维物体。 三、具体代码 &#xff08;1&#xff09;算法实现 // 获取Canvas元素 con…...

TDengine 查询引擎设计

简介 TDengine 作为一个高性能的时序大数据平台&#xff0c;其查询与计算功能是核心组件之一。该平台提供了丰富的查询处理功能&#xff0c;不仅包括常规的聚合查询&#xff0c;还涵盖了时序数据的窗口查询、统计聚合等高级功能。这些查询计算任务需要 taosc、vnode、qnode 和…...

15.第二阶段x64游戏实战-分析怪物血量(遍历周围)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;14.第二阶段x64游戏实战-分析人物的名字 如果想实现自动打怪&#xff0c;那肯定…...

vue浅试(1)

先安装了vue nvm安装详细教程&#xff08;安装nvm、node、npm、cnpm、yarn及环境变量配置&#xff09; 稍微了解了一下cursor ​ cursor的使用 请出我们的老师&#xff1a; 提示词&#xff1a; 你是我的好朋友也是一个前端专家&#xff0c;你能向我传授前端知识&#xff0c…...

VSCode连服务器一直处于Downloading

使用vscode的remote插件连接远程服务器时&#xff0c;部分服务器可能会出现一直处于Downloading VS Code Server的情况 早期的一些教程&#xff0c;如https://blog.csdn.net/chongbin007/article/details/126958840, https://zhuanlan.zhihu.com/p/671718415给出的方法是手动下…...

QGIS实用功能:加载天地图与下载指定区域遥感影像

QGIS 实用功能&#xff1a;加载天地图与下载指定区域遥感影像 目录标题 QGIS 实用功能&#xff1a;加载天地图与下载指定区域遥感影像一、安装天地图插件&#xff0c;开启地图加载之旅二、获取天地图密钥&#xff0c;获取使用权限三、加载天地图服务&#xff0c;查看地图数据四…...

mybatis-plus开发orm

1、mybatis 使用mybatis-generator自动生成代码 这个也是有系统在使用 2、mybatis-plus开发orm--有的系统在使用 MybatisPlus超详细讲解_mybatis-plus-CSDN博客...

ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库

1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1.1. 安装依赖1.2. 安装 osxcross 及 macOS SDK 1.2.1. 可能错误 1.3. 编译 cmake 类工程1.4. 编译 configure 类工程1.5. 单文件…...

抱佛脚之学SSM四

MyBatis基础 一个接口对应一个映射文件 在映射文件中指定对应接口指定的位置 sql语句中id对应方法名par..参数的类型&#xff0c;resul..返回值的类型 WEB-INF下的文件是受保护的&#xff0c;不能直接访问&#xff0c;只能通过请求转发的方式访问 SqlSessionFactory&#xff1…...

2.5 函数的拓展

1.匿名函数&#xff08;简化代码&#xff09; python中没有这个概念&#xff0c;通过lambda关键字可以简化函数的代码写法 2.lambda表达式 arguments lambda 参数列表 &#xff1a; 函数体 print(aarguments(参数)) #测试lambda #原本代码def sum1(x,y):return xyprint(sum1…...

深度学习--卷积神经网络数据增强

文章目录 一、数据增强1、什么是数据增强&#xff1f;2、为什么需要数据增强&#xff1f; 二、常见的数据增强方法1、图像旋转2、图像翻转3、图像缩放4、图像平移5、图像剪切6、图像亮度、对比度、饱和度调整7、噪声添加8、随机扰动 三、代码实现1、预处理2、使用数据增强增加训…...

Buffer of Thoughts: Thought-Augmented Reasoningwith Large Language Models

CODE: NeurIPS 2024 https://github.com/YangLing0818/buffer-of-thought-llm Abstract 我们介绍了思想缓冲(BoT)&#xff0c;一种新颖而通用的思想增强推理方法&#xff0c;用于提高大型语言模型(大型语言模型)的准确性、效率和鲁棒性。具体来说&#xff0c;我们提出了元缓冲…...

mybatisX动态切换数据源直接执行传入sql

代码 mapper接口中方法定义如下&#xff0c;其中#dbName代表传入的数据源变量&#xff08;取值可参考application.properties中spring.datasource.dynamic.datasource指定的数据源&#xff09; DS("#dbName")List<LinkedHashMap<String, Object>> execu…...

N8N MACOS本地部署流程避坑指南

最近n8n很火&#xff0c;就想在本地部署一个&#xff0c;尝尝鲜&#xff0c;看说明n8n是开源软件&#xff0c;可以在本地部署&#xff0c;于是就尝试部署了下&#xff0c;大概用了1个多小时&#xff0c;把相关的过程记录一下&#xff1a; 1、基础软件包 abcXu-MacBook-m2-Air…...

搜索策略的基本概念

搜索是人工智能中的一个基本问题&#xff0c;是推理不可分割的一部分&#xff0c;它直接关系到智能系统的性能与运行效率&#xff0c;因而尼尔逊把它列为人工智能研究中的四个核心问题之一。在过去40多年中&#xff0c;人工智能界已对搜索技术开展了大量研究&#xff0c;取得了…...

云原生--CNCF-1-云原生计算基金会介绍(云原生生态的发展目标和未来)

1、CNCF定义与背景 云原生计算基金会&#xff08;Cloud Native Computing Foundation&#xff0c;CNCF&#xff09;是由Linux基金会于2015年12月发起成立的非营利组织&#xff0c;旨在推动云原生技术的标准化、开源生态建设和行业协作。其核心目标是通过开源项目和社区协作&am…...

【Chrome插件开发】某视频网站的m4s视频/音频下载方案,及其Chrome插件实现-v250415

文章目录 引言效果v1.0.0 TODO让AI写初稿两条路&#xff1a;在content.js里&#xff0c;还是popup.js里发请求&#xff1f;World in content.js新建项目如何打包background.js&#xff1a;在鼠标右键菜单添加一个选项&#xff0c;点击后通知content.js第一次创建弹窗eslint 9如…...

Nginx:前后端分离配置(静态资源+反向代理)

Nginx 前后端分离配置 [!IMPORTANT] 前端静态资源位置&#xff1a;/www/wwwroot/dist后端部署端口&#xff1a;9999 server {listen 80;server_name www.0ll1.com;location / {root /www/wwwroot/dist;try_files $uri $uri/ /index.html;index index.html index.htm;…...

go中map和slice非线程安全

参考视频&#xff1a;百度 Go二面&#xff1a; map与切片哪个是线程安全的_哔哩哔哩_bilibili go中的map和slice是非线程安全类型的。 非线程安全类型的表现为&#xff1a; 并发调用时会报错并发调用后结果不可预测 go中三种线程安全类型&#xff1a; channel&#xff0c;底…...

第T9周:猫狗识别2

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 第T9周&#xff1a;猫狗识别2 tf.config.list_physical_devices(“GPU”)&#xff0c;用于检测当前系统是否有可用的 GPU&#xff0c;并将结果存入 gpus 变量…...

AlmaLinux 9.5 调整home和根分区大小

在使用linux的过程中, 有时会出现因为安装系统时分区不当导致有的分区空间不足,而有的分区空间过剩的情况.下面本文将讲述解决linux系统AlmaLinux 下调整home和根分区大小的方法。 1、查看现有分区 df -Th2、备份/home中的用户数据 mkdir /backup && mv /home/* /ba…...

[Vue3]绑定props 默认值

前言 使用TS、Vue3组织组件中传入props的通用方式 步骤 步骤1&#xff1a;使用 defineProps 定义 Props 使用interface定义props中各项的类型&#xff1a; // 组件List.vue// 定义 Props 类型和接口 interface ListItem {name: string;time: string;content: {status: numbe…...

【android bluetooth 协议分析 11】【AVDTP详解 1】【宏观感受一下avdtp是个啥东东】

我们先从宏观感受一下avdtp协议是个啥东东&#xff0c; 和 a2dp 是啥关系。 在蓝牙协议中的层次。以及他是如何和 例如l2cap 、sdp、a2dp 配合的。先从宏观把握&#xff0c;我们在逐步展开对 avdtp 的源码分析。 我们先从生活中的小例子感性的认识一下 avdtp 在 蓝牙协议中的作…...

【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法)

【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型&#xff08;敏感性分析方法&#xff09; 引言 该文章实现了一个可解释的回归模型&#xff0c;使用NBRO-XGBoost&#xff08;方法可以替换&#xff0c;但是需要有一定的编程基础&#xff09;来预测特征输出。该…...

【Spring】静态代理、动态代理

Java中&#xff0c;代理模式是一种设计模式&#xff0c;用于通过代理对象控制对目标对象的访问。代理可以分为静态代理和动态代理&#xff0c;其中动态代理又包括JDK动态代理和CGLIB动态代理。这些机制在Spring框架中广泛用于AOP&#xff08;面向切面编程&#xff09;、事务管理…...

关于el-table可展开行实现懒加载的方案

场景&#xff1a; 一个流程记录&#xff0c;以表格的形式展示。点击展开表格的某一行&#xff0c;可以看到该流程的详细记录。但是&#xff0c;详细记录数据独立于表格数据&#xff0c;在还没有展开这一行的时候就不去请求这一行的详细数据&#xff0c;以便加快网络请求的速度。…...

AutoJs相关学习

一、控件点击、模拟点击 如果一个控件的 clickablefalse&#xff0c;但它的父级控件是 clickabletrue&#xff0c;我们可以通过 向上查找父级控件 的方式找到可点击的父级&#xff0c;然后执行点击操作。以下是几种实现方法&#xff1a; 方法 1&#xff1a;使用 parent() 查找可…...

ISO15189认证有什么要求?ISO15189认证流程

ISO 15189 认证要求及流程详解 ISO 15189 是国际标准化组织&#xff08;ISO&#xff09;针对 医学实验室质量和能力 的认证标准&#xff0c;适用于医院检验科、第三方医学实验室、血站等机构。该认证确保实验室的技术能力和管理体系符合国际标准&#xff0c;提高检测结果的准确…...

【每天一个知识点】大模型的幻觉问题

“大模型的幻觉问题”是指大语言模型&#xff08;如GPT系列、BERT衍生模型等&#xff09;在生成内容时&#xff0c;产生不符合事实或逻辑的虚假信息&#xff0c;即所谓的“幻觉”&#xff08;hallucination&#xff09;。这在诸如问答、摘要、翻译、代码生成等任务中尤其常见。…...

光谱相机在肤质检测中的应用

光谱相机在肤质检测中具有独特优势&#xff0c;能够通过多波段光谱分析皮肤深层成分及生理状态&#xff0c;实现‌非侵入式、高精度、多维度的皮肤健康评估‌。以下是其核心应用与技术细节&#xff1a; ‌一、工作原理‌ ‌光谱反射与吸收特性‌&#xff1a; ‌血红蛋白‌&a…...

【c语言】指针和数组笔试题解析

一维数组: //数组名a如果既不单独放在sizeof()中&#xff0c;也不与&结合&#xff0c;那么就表示数组首元素的大小 //a一般表示数组首元素地址&#xff0c;只有两种情况表示整个数组&#xff0c;sizeof(arr)表示整个数组的大小&#xff0c;&arr表示数组的地址 int a[]…...

【Spring】AutoConfigureOrder与Order注解的区别与使用方式

@AutoConfigureOrder与@Order都是Spring框架中用于控制组件优先级的注解,但它们有不同的应用场景和作用范围。 一、基本区别 1. 包和位置 @Order: 位于org.springframework.core.annotation包,是Spring核心包的一部分@AutoConfigureOrder: 位于org.springframework.boot.au…...

基于SpringBoot的校园赛事直播管理系统-项目分享

基于SpringBoot的校园赛事直播管理系统-项目分享 项目介绍项目摘要管理员功能图用户功能图项目预览首页总览个人中心礼物管理主播管理 最后 项目介绍 使用者&#xff1a;管理员、用户 开发技术&#xff1a;MySQLJavaSpringBootVue 项目摘要 随着互联网和移动技术的持续进步&…...

科研小白可以做哪些准备

断更五个月啦&#xff0c;这段时间一直忙于自己的研究课题。今天给大家分享我在这段时间对科研的一些认识和积累的经验&#xff0c;希望对大家有所帮助。 一、学术研究的认识与思考 什么是科研 什么是好的研究 首先&#xff0c;就是要回答“什么是科研&#xff1f;什么是好研…...

2025.4.22学习日记 JavaScript的常用事件

在 JavaScript 里&#xff0c;事件是在文档或者浏览器窗口中发生的特定交互瞬间&#xff0c;例如点击按钮、页面加载完成等等。下面是一些常用的事件以及案例&#xff1a; 1. click 事件 当用户点击元素时触发 const button document.createElement(button); button.textCo…...

TikTok X-Gnarly纯算分享

TK核心签名校验&#xff1a;X-Bougs 比较简单 X-Gnarly已经替代了_signature参数&#xff08;不好校验数据&#xff09; 主要围绕query body ua进行加密验证 伴随着时间戳 浏览器指纹 随机值 特征值 秘钥转换 自写算法 魔改base64编码 与X-bougs 长a-Bougs流程一致。 视频…...

CentOS7 环境配置

CentOS 7 环境配置 我的基础环境&#xff1a; Windows11 CentOS版本&#xff1a;CentOS Linux release 7.7.1908 (Core) Vmware版本&#xff1a;VMware Workstation 17 Pro 17.5.0 build-22583795 使用工具&#xff1a;MobaXterm 注意&#xff1a; 所有有关防火墙的操作都可以…...

缓存,内存,本地缓存等辨析

快速辨析缓存&#xff0c;内存&#xff0c;本地缓存&#xff0c;memcache&#xff0c;redis等 &#xff08;个人临时记录&#xff09; 缓存 泛指所有用于暂存数据以提升访问速度的技术&#xff0c;包括本地缓存、分布式缓存、CPU缓存等。核心目标是减少对慢速存储&#xff08…...

C++模板学习(进阶)

目录 一.非类型模板参数 二.模板的特化 一&#xff09;.函数模板特化 二&#xff09;.类模板特化 1.全特化 2.偏特化 三.模板分离编译 一&#xff09;.什么是分离编译 1. 问题描述 2. 模板的实例化机制 3. 分离编译的困境 二&#xff09;.解决方法 1. 头文件包含…...

【Git】fork 和 branch 的区别

在 Git 中&#xff0c;“fork” 和 “branch” 是两个不同的概念&#xff0c;它们用于不同的场景并且服务于不同的目的。理解这两者的区别对于有效地使用 Git 进行版本控制非常重要。 1. Fork&#xff08;分叉&#xff09; 定义 Fork 是指在 GitHub、GitLab 等代码托管平台上…...

STM32单片机入门学习——第45节: [13-2] 修改频主睡眠模式停止模式待机模式

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.22 STM32开发板学习——第45节: [13-2] 修改主频&睡眠模式&停止模式&待…...

Java中常见API的分类概述及示例

1. 集合框架&#xff08;java.util 包&#xff09; 核心接口与实现类 接口实现类特点示例代码ListArrayList, LinkedList有序、可重复List<String> list new ArrayList<>(); list.add("Java");SetHashSet, TreeSet无序、唯一Set<Integer> set …...