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

算法第一弹-----双指针

目录

1.移动零

2.复写零

3.快乐数

4.盛水最多的容器

5.有效三角形的个数

6.查找总价值为目标值的两个商品

7.三数之和

8.四数之和


双指针通常是指在解决问题时,同时使用两个指针(变量,常用来指向数组、链表等数据结构中的元素位置),通过对这两个指针的移动和操作来高效地处理数据、查找元素、遍历结构等,从而达到降低时间复杂度、优化算法的目的。

 

根据指针移动的方向和规则不同,双指针可以大致分为以下两类:

  • 同向双指针
    两个指针起始位置可能相同或者不同,但它们朝着同一个方向移动,比如都从数组头部向尾部移动,常用于处理需要连续遍历部分区间、查找满足特定条件的子区间等问题。常使用快慢指针

  • 对撞双指针
    两个指针分别从数据结构(常见的如数组、字符串等)的两端开始,然后相向而行,朝着彼此靠近的方向移动,这种方式常常应用在判断回文、两数之和类问题(当数据有序时)等场景中。

1.移动零

283. 移动零 - 力扣(LeetCode)


题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。


示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

解法:(使用快排的思想,将数组划分区间)

算法思路:

1.我们使用两个指针(left,right),规定left左边区域为非零的数字,right去向后扫描,遇到非零的数字,先让left++,然后再让left和right所指下标的数字进行交换,这样就保证了当right扫描完整个数组时,left左边(包括left)的区域全是非零的数字

2.left初始化为-1,是因为left指向的是非零元素的最后一个位置,刚开始我们并不知道最后一个非零元素在哪,所以初始化为-1,right是用来扫描的,所以初始化为0


JAVA算法代码:

class Solution {public void moveZeroes(int[] nums) {int left=-1;int right=0;for(;right<nums.length;right++){
if(nums[right]!=0){
left++;
int tmp=nums[left];
nums[left]=nums[right];
nums[right]=tmp;
}}}
}

2.复写零

1089. 复写零 - 力扣(LeetCode)


题目描述:

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。


示例 1:

输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

示例 2:

输入:arr = [1,2,3]
输出:[1,2,3]
解释:调用函数后,输入的数组将被修改为:[1,2,3]

解法:分三步,第一步找到最后一个要复写的元素,第二步处理一下边界情况,第三步从后往前遍历数组,依次填写出复写后的结果

算法思路

1.使用cur去遍历数组,dest去确定最后一个复写元素的位置,cur初始化为0,dest初始化为-1

2.使用cur遍历数组,当cur所指元素不为0时,dest++,当cur所指元素为0时dest+=2;并且每次循环判断dest是否到达数组的最后一个位置或超出数组,如果dest>=arr.length-1,那么就找到了最后一个要复写的元素,直接break跳出循环

3.当最后一个要复写的元素是0时,且dest处在数组的倒数第二个位置,这时,dest就会向后走两格,就会造成数组越界,其他情况均不会造成数组越界

4.面对数组越界这种情况,我们在从后往前填写复写结果时,需要做一下边界处理,当dest为n时,也就是越界了,因为此时一定是最后一个复写元素是0,我们需要将数组的最后一个元素设为0,然后dest-=2,cur--

5.从后往前复写,当cur所指元素为0时,dest位置设置为0,dest-1位置也设置为0,dest-=2,cur--

当cur所指元素不为0时,将dest位置设置为cur所指元素,dest--,cur--,当cur<0时,也就是cur从后往前遍历完毕,复写操作也就完毕了


JAVA算法代码:

class Solution {public void duplicateZeros(int[] arr) {int dest=-1;int cur=0;int n=arr.length;
//找到要的结果的最后一个位置while(dest<n){
if(arr[cur]==0)dest+=2;
else dest++;
if(dest>=n-1)break;
cur++;}
//处理边界情况if(dest==n){arr[n-1]=0;cur--;dest-=2;}
//从后往前写
while(cur>=0){
if(arr[cur]==0){arr[dest--]=0;arr[dest--]=0;
}else{arr[dest--]=arr[cur];
}
cur--;
}}
}

3.快乐数

202. 快乐数 - 力扣(LeetCode)


题目描述:

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false


示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

解法:快慢指针,判断相遇时的值是否为1

算法思路

1.题目中给出的数据范围是1 <= n <= 2的31次方 - 1,2的31次方是一个10位数的数字,我们以9999999999的平方和来算,也就是810,那么在这个数据范围内的所有数据的平方和也就在1~810这个范围

2.根据鸽巢原理,当我们计算到第811个平方和时,就必然会陷入的一个循环

3.在这个循环里面,通过快慢指针,找到快慢指针相遇时的值,判断是否为1,如果为1,那么这个数就是快乐数,如果不为1,那么这个数就不是快乐数

4.快指针每次计算两次平方和,慢指针每次计算一次平方和;当快指针与慢指针相遇时,但相遇时的值不为1,这个数一定不是快乐数,这是因为快指针往后走的过程中,如果他有一次的平方和为1,那么他后面所有的平方和一定就都为1,陷入了一个1的循环,当快慢指针相遇时的结果不为1,说明快指针在走的过程中没有一次的平方和是1,就可以判定他必然不是快乐数


JAVA算法代码:

class Solution {
//计算平方和
public int quaSum(int n){
int sum=0;
while(n!=0){
int x=n%10;
sum+=x*x;
n/=10;
}
return sum;
}public boolean isHappy(int n) {int fast=quaSum(n);int slow=n;
while(slow!=fast){
fast=quaSum(quaSum(fast));
slow=quaSum(slow);
}
return slow==1;}
}

4.盛水最多的容器

11. 盛最多水的容器 - 力扣(LeetCode)


题目描述

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。


示例 1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

解法:(对撞指针)

算法思路

1.使用两个指针(left,right)分别指向这个容器的两端,计算容器的大小,通过移动指针,找到最大的容器

2.当移动指针宽度是一定减小的,此时如果再移动高的一边(也就是较高高度一边的指针),那么容器的大小一定是减小的,容器的大小是由宽度和较小一边的高度决定的,移动指针时,只能移动较矮一边的指针

3.新的容器大小和之前的最大的容器大小比较,如果比之前大,就将之前的最大容器修改为新的容器大小,否则继续计算下一个容器的大小,直到两个指针相遇,返回最大的容器大小


JAVA算法代码

class Solution {public int maxArea(int[] height) {int left=0;int right=height.length-1;int ret=0;int v=0;while(left<right){
v=Math.min(height[left],height[right])*(right-left);
ret=Math.max(ret,v);
if(height[left]<height[right])left++;
else right--;}
return ret;}
}

5.有效三角形的个数

611. 有效三角形的个数 - 力扣(LeetCode)


题目描述

给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。


示例 1:

输入: nums = [2,2,3,4]
输出: 3
解释:有效的组合是: 
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3

示例 2:

输入: nums = [4,2,3,4]
输出: 4

解法:排序,对撞指针

算法思路

1.对数组进行排序,当较小的两边和大于第三边时,那么三边中中间大的数与最小边中间的数均可与中间大的数和最大边构成三角形

2.通过循环,每次固定最大边,left表示最小边,right表示中间的边

3.最大边从数组长度-1开始--(用i表示),left在每次循环里初始化为0,right在每次循环里初始化为i-1;ret记录符合条件的个数。

4.当nums[left]+nums[right]>nums[i]时,说明用left到right之间的数来充当left,nums[left]+nums[right]的结果都是大于nums[i],此时ret+=right-left,将right像左移动,再继续判断下一个区间

5.当nums[left]+nums[right]<nums[i]时,不符合条件,我们需要将left向右移动,使nums[left]+nums[right]的值更大,当left与right相遇时,说明i固定的值的所有可能结果找完了


JAVA算法代码:

class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int ret=0;for(int i=nums.length-1;i>=2;i--){
int left=0;
int right=i-1;
while(left<right){
if(nums[left]+nums[right]>nums[i]){ret+=right-left;right--;
}else
left++;
}}return ret;}
}

6.查找总价值为目标值的两个商品

LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)


题目描述

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。


示例 1:

输入:price = [3, 9, 12, 15], target = 18
输出:[3,15] 或者 [15,3]

示例 2:

输入:price = [8, 21, 27, 34, 52, 66], target = 61
输出:[27,34] 或者 [34,27]

解法:对撞指针

算法思路

1.定义left和right两个指针

2.left初始化为1,right初始化为price.length-1

3.计算price[left]+price[right]的和与target做比较,大于righr--,小于left++,等于返回含有这两个元素的数组


JAVA算法代码

class Solution {public int[] twoSum(int[] price, int target) {int left=0;int right=price.length-1;while(left<right){
if(price[left]+price[right]>target)right--;
else if(price[left]+price[right]<target)left++;
elsereturn new int[] {price[left], price[right]};}return new int[]{0};}
}

7.三数之和

15. 三数之和 - 力扣(LeetCode)


题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。


示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

解法:固定一个数,取相反值,对撞指针

算法思路

1.对数组进行排序

2.遍历数组,每次遍历,固定当前这个数,计算他的相反值,定义两个指针(left,right),left初始化为i+1,right初始化为nums.length-1,使用对撞指针,在i后面的区域内搜寻nums[left]+nums[right]==target的值,找到了就将i,left,right所指的值添加到链表里面

3.如果i所指的值是大于0的,那么就不用继续搜寻了,因为-nums[i]为负数,后面的nums[left]+nums[right]始终为正

4.去重操作,当我们找到一组数后,需要对left,right的值进行去重操作,当固定完一个数后,也需要对这个固定的数进行去重操作


JAVA算法代码

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>>ret=new ArrayList<>();Arrays.sort(nums);
int n=nums.length;for(int i=0;i<n;){
int target=-nums[i];
int left=i+1;
int right=n-1;
if(nums[i]>0)break;
while(left<right){
if((nums[left]+nums[right])==target){ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left], nums[right])));left++;right--;while(left<right&&nums[left-1]==nums[left])left++;
while(left<right&&nums[right+1]==nums[right])right--;
}else if(nums[left]+nums[right]<target)left++;
else right--;
}
i++;
while(i<n&&nums[i-1]==nums[i])i++;}
return ret;}
}

8.四数之和

18. 四数之和 - 力扣(LeetCode)


题目描述

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。


示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

解法:基于三数之和

算法思路

1.对数组进行排序

2.从0开始遍历数组,固定第一个数,从固定i+1位置数,遍历第二个数,用target减去第一个和第二个数得到aim,aim可能会超出int的范围,用long类型处理一下

3.用对撞指针left和right搜寻两数之和为aim的可能结果,每次找到,对left和right进行去重处理,第一个数和第二个数在自己循环一次过后也需要进行去重处理


JAVA算法代码

class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>>ret=new ArrayList<>();Arrays.sort(nums);int n=nums.length;for(int i=0;i<n-3;){
for(int j=i+1;j<n-2;){
int left=j+1;
int right=n-1;
long aim=(long)target-nums[j]-nums[i];
while(left<right){long sum=nums[left]+nums[right];
if(sum<aim)left++;
else if(sum>aim)right--;
else{
ret.add(new ArrayList<>(Arrays.asList(nums[i],nums[j],nums[left],nums[right])));
left++;
right--;
while(left<right&&nums[left-1]==nums[left])left++;
while(left<right&&nums[right+1]==nums[right])right--;
}
}
j++;
while(j<n-2&&nums[j-1]==nums[j])j++;
}
i++;
while(i<n-3&&nums[i-1]==nums[i])i++;}return ret;}
}

相关文章:

算法第一弹-----双指针

目录 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.查找总价值为目标值的两个商品 7.三数之和 8.四数之和 双指针通常是指在解决问题时&#xff0c;同时使用两个指针&#xff08;变量&#xff0c;常用来指向数组、链表等数据结构中的元素位置&am…...

学习如何解决“区间划分”问题(一般方法论+实例应用讲解)

文章目录 解决“区间划分”问题的一般方法论方法论&#xff1a;解决区间划分问题的四步法1. 问题分析与建模2. 动态规划状态的定义3. 状态转移方程4. 初始条件与边界 方法论应用&#xff1a;最小和最大石子合并得分问题描述步骤 1&#xff1a;问题分析与建模步骤 2&#xff1a;…...

消息中间件-Kafka2-3.9.0源码构建

消息中间件-Kafka2-3.9.0源码构建 1、软件环境 JDK Version 1.8Scala Version 2.12.0Kafka-3.9.0 源码包 下载地址&#xff1a;https://downloads.apache.org/kafka/3.9.0/kafka-3.9.0-src.tgzGradle Version > 8.8Apache Zookeeper 3.7.0 2、源码编译 打开源码根目录修改…...

达梦归档文件名与实例对应关系

默认的&#xff0c;达梦归档文件名比较难以看懂&#xff0c;且多实例下不好区分 靠它就行 select upper(to_char((select DB_MAGIC), xxxxxxxxxx)) mag_id; 这样就对上号了。...

STL算法之sort

STL所提供的各式各样算法中&#xff0c;sort()是最复杂最庞大的一个。这个算法接受两个RandomAccessIterators(随机存取迭代器)&#xff0c;然后将区间内的所有元素以渐增方式由小到大重新排列。还有一个版本则是允许用户指定一个仿函数代替operator<作为排序标准。STL的所有…...

elementui table滚动分页加载

文章目录 概要 简化的实现示例&#xff1a; 小结 概要 在使用 Element UI 的 Table 组件时&#xff0c;如果需要实现滚动分页加载的功能&#xff0c;可以通过监听 Table 的滚动事件来动态加载更多数据。 简化的实现示例&#xff1a; <template><el-table ref"…...

【MySQL 进阶之路】索引的使用

5.索引的使用规则 在数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;索引是提高查询效率的关键机制之一。MySQL索引优化是指通过设计、调整和选择合适的索引策略&#xff0c;以提高数据库的查询性能和降低资源消耗。以下是一些关键的索引使用规则&#xff1a; 1. …...

FPGA中所有tile介绍

FPGA中包含的tile类型&#xff0c;以xinlinx 7k为例&#xff0c;可以通过f4pga项目中的原语文件夹查看&#xff0c;主要包含以下这些&#xff1a; 以下是您提到的 Xilinx 7 系列 FPGA 中各种模块的含义及用途&#xff1a; 1. BRAM (Block RAM) BRAM 是 FPGA 中的块存储资源&…...

理解 Python PIL库中的 convert(‘RGB‘) 方法:为何及如何将图像转换为RGB模式

理解 Python PIL库中的 convert(RGB) 方法&#xff1a;为何及如何将图像转换为RGB模式 在图像处理中&#xff0c;保持图像数据的一致性和可操作性是至关重要的。Python的Pillow库&#xff08;继承自PIL, Python Imaging Library&#xff09;提供了强大的工具和方法来处理图像&…...

LVS默认的工作模式支持哪些负载均衡算法?

LVS默认的工作模式支持哪些负载均衡算法? LVS&#xff08;Linux Virtual Server&#xff09;默认支持多种负载均衡算法&#xff0c;这些算法在不同的场景下具有各自的优势。以下是 LVS 默认支持的负载均衡算法及其特点&#xff1a; 1. 轮询调度&#xff08;Round Robin Sched…...

C/C++中的调用约定

在C/C编程中&#xff0c;调用约定(calling conventions)是一组指定如何调用函数的规则。主要在你调用代码之外的函数(例如OS API&#xff0c;操作系统应用程序接口)或OS调用你(如WinMain的情况)时起作用。如果编译器不知道正确的调用约定&#xff0c;那么你很可能会遇到非常奇怪…...

RAG评估指南:从检索到生成,全面解析LLM性能评估方法

前言 这一节我们将从时间线出发对RAG的评估方式进行对比&#xff0c;这些评估方式不仅限于RAG流程之中&#xff0c;其中基于LLM的评估方式更加适用于各行各业。 RAG常用评估方式 上一节我们讲了如何用ROUGE 这个方法评估摘要的相似度&#xff0c;由于篇幅限制&#xff0c;没…...

极兔速递开放平台快递物流查询API对接流程

目录 极兔速递开放平台快递物流查询API对接流程API简介物流查询API 对接流程1. 注册用户2. 申请成为开发者3. 企业认证4. 联调测试5. 发布上线 签名机制详解1. 提交方式2. 签名规则3. 字段类型与解析约定 物流轨迹服务极兔快递单号查询的其他方案总结 极兔速递开放平台快递物流…...

FFmpeg:强大的音视频处理工具指南

FFmpeg&#xff1a;强大的音视频处理工具指南 1. FFmpeg简介2. 核心特性2.1 基础功能2.2 支持的格式和编解码器 3. 主要组件3.1 命令行工具3.2 开发库 4. 最新发展5. 安装指南5.1 Windows系统安装5.1.1 直接下载可执行文件5.1.2 使用包管理器安装 5.2 Linux系统安装5.2.1 Ubunt…...

项目集成篇:springboot集成redistemple实现自定义缓存,并且可以设置过期时间

在Spring Boot中集成Redis并使用RedisTemplate实现自定义缓存功能&#xff0c;同时能够设置缓存项的过期时间&#xff0c;可以通过以下步骤来完成。我们将创建一个服务层方法&#xff0c;该方法将使用RedisTemplate直接与Redis交互&#xff0c;并为每个缓存项设置特定的过期时间…...

ClickHouse守护进程

背景描述 维护CK过程中&#xff0c;有时候会有CK OOM&#xff0c;并且CK自己没有自动拉起的情况出现&#xff1b;那么这个时候就需要守护进程&#xff0c;最初我不说了Supervisor来做守护进程&#xff0c;但是当我手动kill的时候发现并没有自动拉起。 解决方案 于是乎自己写…...

【Vivado】xdc约束文件编写

随手记录一下项目中学到的约束文件编写技巧。 时序约束 创建生成时钟 参考链接&#xff1a; Vivado Design Suite Tcl Command Reference Guide (UG835) Vivado Design Suite User Guide: Using Constraints (UG903) 通过Clocking Wizard IP创建的时钟&#xff08;MMCM或…...

Nginx静态资源配置

基本配置原则 明确资源目录&#xff1a;为不同类型的静态资源指定不同的路径&#xff0c;这样可以避免路径冲突&#xff0c;并且便于管理。正确设置文件权限&#xff1a;确保 Nginx 具有读取静态资源的权限。缓存优化&#xff1a;为静态资源设置缓存头&#xff08;如 expires&…...

365天深度学习训练营-第P7周:马铃薯病害识别(VGG-16复现)

文为「365天深度学习训练营」内部文章 参考本文所写记录性文章&#xff0c;请在文章开头带上「&#x1f449;声明」 &#x1f37a; 要求&#xff1a; 自己搭建VGG-16网络框架【达成√】调用官方的VGG-16网络框架【达成√】如何查看模型的参数量以及相关指标【达成√】 &#…...

docker学习笔记(三)--容器数据卷

文章目录 一、数据卷的介绍二、简单用法--直接指定挂载路径三、具名挂载与匿名挂载具名挂载匿名挂载 一、数据卷的介绍 docker将应用和环境打包成一个镜像&#xff0c;形成一个容器运行。那么容器产生的数据&#xff0c;如果不通过docker commit命令提交生成新的镜像&#xff…...

联通光猫DT741-csf 完全po解 改桥接

1.管理员密码破解&#xff0c;把光猫的loid pppoe用户名密码&#xff0c;各个连接vlan id记下来 打开链接 http://192.168.1.1/hidden_version_switch.html version选择Default Version&#xff0c;点击submit&#xff0c;光猫默认重启。重启后ip地址变为192.168.1.1 并且dhcp…...

Java Web 2 JS Vue快速入门

一 JS快速入门 1.什么是JavaScript&#xff1f; 页面交互&#xff1a; 页面交互是指用户与网页之间的互动过程。例如&#xff0c;当用户点击一个按钮&#xff0c;网页会做出相应的反应&#xff0c;如弹出一个对话框、加载新的内容或者改变页面的样式等&#xff1b;当用户在表…...

【数据结构】动态规划-基础篇

针对动态规划问题&#xff0c;我总结了以下5步&#xff1a; 确定dp数组以及下标的含义&#xff1b; 递推公式&#xff1b; dp数组如何初始化&#xff1b; 遍历顺序&#xff1b; 打印dp数组&#xff08;用来debug&#xff09;&#xff1b; 以上5步适用于任何动态规划问题&#x…...

从watch、watchEffect、useEffect原理到vue、react响应原理

正文 1.核心原理 Vue中的watch、watchEffect是基于Vue的响应式系统&#xff08;Proxy&#xff09;&#xff0c;依赖于ref或reactive数据的变化。React中的useEffect基于状态驱动的重新渲染机制&#xff0c;通过依赖数组 [dependency]&#xff0c;手动声明需要追踪的状态或属性…...

Cursor+Devbox AI开发快速入门

1. 前言 今天无意间了解到 Cursor 和 Devbox 两大开发神器,初步尝试以后发现确实能够大幅度提升开发效率,特此想要整理成博客以供大家快速入门. 简单理解 Cursor 就是一款结合AI大模型的代码编辑器,你可以将自己的思路告诉AI,剩下的目录结构的搭建以及项目代码的实现均由AI帮…...

SpringBoot+MyBatis整合ClickHouse实践

整合Spring Boot、MyBatis和ClickHouse可以让你使用Java开发的应用程序高效地与ClickHouse数据库进行交互。以下是一个基本的步骤指南&#xff0c;帮助你完成这个整合过程&#xff1a; 1. 添加依赖 首先&#xff0c;在你的pom.xml文件中添加必要的Maven依赖。你需要引入Sprin…...

在数据库设计中同步冗余字段的思考与实践

目录 前言1. 冗余字段设计的背景与场景1.1 场景描述1.2 冗余字段的必要性 2. 冗余字段设计的优点2.1 提高查询效率2.2 简化应用逻辑 3. 冗余字段设计的缺点与挑战3.1 数据不一致问题3.2 更新开销增加3.3 数据冗余占用存储空间 4. 如何同步更新冗余字段4.1 手动更新方式4.2 使用…...

MacOS安装sshfs挂载远程电脑硬盘到本地

文章目录 sshfs简介sshfs安装下载安装macFUSE安装sshfs sshfs使用注意事项 sshfs简介 SSHFS&#xff08;SSH Filesystem&#xff09;是一种基于FUSE&#xff08;用户空间文件系统&#xff09;的文件系统&#xff0c;它允许你通过SSH协议挂载远程文件系统。使用SSHFS&#xff0…...

6.824/6.5840(2024)环境配置wsl2+vscode

本文是经过笔者实践得出的最速の环境配置 首先&#xff0c;安装wsl2和vscode 具体步骤参见Mit6.s081环境配置踩坑之旅WSL2VScode_mit6s081-CSDN博客 接下来开始为Ubuntu(笔者使用的版本依然是20.04)配置go的相关环境 1、更新Ubuntu的软件包 sudo apt-get install build-es…...

查询产品所涉及的表有(product、product_admin_mapping)

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService1. 完整SQL分析可选部分&#xff08;条件筛选&#xff09;&#xff1a; 2. 涉及的表3. 总结4. 功能概述 查询指定管理员下所有产品所涉及的表&#xff1f;…...

C# 冒泡的算法

C# 冒泡的算法 public void BubbleSort(int[] arr) {int temp;for (int j 0; j < arr.Length - 2; j){for (int i 0; i < arr.Length - 2; i){if (arr[i] > arr[i 1]){temp arr[i 1];arr[i 1] arr[i];arr[i] temp;}}} }使用方法 int[] array new int[] { 5,…...

前端上传后端接收参数为null

记录一下工作中的问题 前端明明把文件传到后台了&#xff0c;但是后台接收参数为null 原因&#xff1a; 前端上传文件的name和后端接收参数名称不匹配 前端 后端 把前端上传的name由upfile改为file即可 本来是很基本的小问题&#xff0c;但因为自己钻了牛角尖一直没搞定&…...

思考:如何把知识更轻松的传递给别人

为什么我会来思考这个问题呢&#xff0c;我想要把我学到的东西传递给其他人&#xff0c;也就是能够成为一个老师&#xff0c;我曾多次尝试解决问题&#xff0c;但是事情总是不如我所愿。现在我进行一定的总结&#xff0c;来复盘一下我的教授过程。 在学生面对新鲜事物的同时&am…...

BERT的中文问答系统50

我们将对BERT的中文问答系统48-1代码进行以下改进: 1.增加时间日期和日历功能:在GUI中增加显示当前时间和日期的功能,并提供一个日历组件。 2.增加更多模型类型:增加娱乐、电脑、军事、汽车、植物、科技、历史(朝代、皇帝)、名人、生活(出行、菜品、菜谱、居家),法律、…...

node.js实现分页,jwt鉴权机制,token,cookie和session的区别

文章目录 1. 分⻚功能2. jwt鉴权机制1.jwt是什么2.jwt的应用3.优缺点 3. cookie&#xff0c;token&#xff0c;session的对比 1. 分⻚功能 为什么要分页 如果数据量很⼤&#xff0c;⽐如⼏万条数据&#xff0c;放在⼀个⻚⾯显⽰的话显然不友好&#xff0c;这时候就需要采⽤分⻚…...

OpenHarmony-4.GPIO驱动

GPIO 1.功能简介 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出。GPIO又俗称为I/O口&#xff0c;I指的是输入(in&#xff09;&#xff0c;O指的是输出&#xff08;out&#xff09;。可以通过软件来控制其输入和输出&#xff0c;即I/O控制。通常&…...

static关键字在嵌入式C编程中的应用

目录 一、控制变量的存储周期和可见性 1.1. 局部静态变量 1.2. 全局静态变量 二、控制函数的可见性 2.1. 静态函数 2.2. 代码示例&#xff08;假设有两个文件&#xff1a;file1.c和file2.c&#xff09; 三、应用场景 3.1. 存储常用数据 3.2. 实现内部辅助函数 四、注…...

图形开发基础之在WinForms中使用OpenTK.GLControl进行图形绘制

前言 GLControl 是 OpenTK 库中一个重要的控件&#xff0c;专门用于在 Windows Forms 应用程序中集成 OpenGL 图形渲染。通过 GLControl&#xff0c;可以轻松地将 OpenGL 的高性能图形绘制功能嵌入到传统的桌面应用程序中。 1. GLControl 的核心功能 OpenGL 渲染上下文&…...

macOS sequoia 15.1中应用程序“程序坞”没有权限打开

在macOS sequoia 15.1版本中新安装的应用程序在访达中打开报错显示应用程序“程序坞”没有权限打开“(null)”。 解决办法 在启动台中找到终端&#xff0c;点击打开&#xff0c;切换到应用目录下&#xff0c;输入 cd /Applications/ 找到需要打开的应用程序目录&#xff0…...

汉诺塔递归问题(C++)

汉诺塔递归问题 汉诺塔是典型的递归问题&#xff0c;这个问题可以这样描述&#xff1a; 完成目标&#xff1a; 将n个盘子从A搬运到C&#xff0c;求需要移动多少次完成&#xff1f; **约束条件&#xff1a;**搬运的过程中每次只能移动一个盘子&#xff0c;且不能出现大的盘子…...

【开源】A060-基于Spring Boot的游戏交易系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…...

抖音SEO短视频矩阵源码私有化部署

为了开发一套高效的抖音短视频SEO矩阵系统&#xff0c;开发者需要掌握以下核心技术&#xff1a; 网络编程&#xff1a;具备使用Python、Java或其他编程语言进行网络编程的能力&#xff0c;能够利用爬虫技术从抖音平台获取数据。 数据处理&#xff1a;熟悉并能够应用数据处理工…...

深入浅出:Python 编程语言的学习之路

文章目录 1. Python 简介2. Python 的安装与环境配置2.1 安装 Python2.2 配置开发环境 3. Python 基础语法3.1 变量与数据类型示例代码&#xff1a;定义变量 3.2 控制结构示例代码&#xff1a;条件语句示例代码&#xff1a;循环语句 3.3 函数与模块示例代码&#xff1a;定义函数…...

R语言机器学习论文(三):特征提取

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据一、数据归一化二、离散型分类变量的编码三、筛选特征四、重要特征五、输出结果六、总结系统信息介绍 在数据分析和机器学习项目中,经常需要对数据进行预…...

【C#设计模式(17)——迭代器模式(Iterator Pattern)】

前言 迭代器模式可以使用统一的接口来遍历不同类型的集合对象&#xff0c;而不需要关心其内部的具体实现。 代码 //迭代器接口 public interface Iterator {bool HashNext();object Next(); } //集合接口 public interface Collection {Iterator CreateIterator(); } //元素迭…...

【云原生系列】云计算中的负载均衡是什么,有什么用

云计算里有一个非常重要的概念叫“负载均衡”&#xff0c;如果你经常听到这个词但还不太明白具体是怎么回事&#xff0c;这篇文章可以给你一些思路。负载均衡简单来说就是“分担压力”&#xff0c;确保访问量被合理地分配到各个服务器上&#xff0c;让系统高效且稳定地运行。 …...

笔记本电脑usb接口没反应怎么办?原因及解决方法

笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能&#xff0c;无论是数据传输、充电还是外接设备&#xff0c;都离不开它。然而&#xff0c;当USB接口突然没有反应时&#xff0c;这无疑会给我们的工作和学习带来不小的困扰。下面&#xff0c;我们就来探讨一下笔记本USB接…...

容器运行应用及Docker命令

文章目录 一、使用容器运行Nginx应用1_使用docker run命令运行Nginx应用1 观察下载容器镜像过程2 观察容器运行情况 2_访问容器中运行的Nginx服务1 确认容器IP地址2 容器网络说明3 使用curl命令访问 二、Docker命令1_Docker命令获取帮助方法2_Docker官网提供的命令说明3_docker…...

PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

全文摘要 本文介绍了一种名为PETRv2的统一框架&#xff0c;用于从多视图图像中进行三维感知。该框架基于先前提出的PETR框架&#xff0c;并探索了时间建模的有效性&#xff0c;利用前一帧的时间信息来提高三维物体检测效果。作者在PETR的基础上扩展了三维位置嵌入&#xff08;…...

Python库常用函数-数据分析

Python库常用函数 1.pandas库 &#xff08;1&#xff09;数据读取与写入 读取 CSV 文件&#xff1a; data pd.read_csv(file.csv)读取 Excel 文件&#xff1a; data pd.read_excel(file.xlsx, sheet_nameSheet1)写入 CSV 文件&#xff1a; data.to_csv(new_file.csv, ind…...