014枚举之指针尺取——算法备赛
枚举是数据结构与算法中基本的操作,常用于解决序列的区间问题。算法界将"双指针"视为其重要分支,类似地当然还有"三指针",“四指针”,最常见的还是“双指针”,我认为它们应统称为“指针尺取”。
双指针无疑就是定义两个变量记录内存空间位置(一般为线性数组下标)来进行枚举,常见的枚举策略有“反向扫描”,“同向扫描”。
- 反向扫描,两指针的枚举方向不同,又可分为“两端向中间收缩”,“中间向两边扩散”等。
- 正向扫描,两指针的枚举方向相同,起始位置或速度不同,常见的策略有“定右统左”。
定右统左
定右统左是双指针中的常用策略,即固定右端点,统计左端点
,常用于区间统计。
子串简写
问题描述
规定长度大于等于k的字符串可以采用 用数值(中间字符数量)代替中间字符保留首尾字符的简写方法。
如k=4 “abjdjda” 可简写为 “a5a”
给定 k,字符串S,首尾字符c1,c2,问S有多少个首尾字符分别为c1,c2的子串可采用上述简写方法.
原题链接
思路分析
采用双指针(前指针i
(初始为k-1),后指针j
(初始为0)) 遍历子串长度为k的首尾字符,当j遍历到首字符为c1时,c1_sum++
,c1_sum
为一个统计数值,表示长度等于k且首字符为c1的子串个数(长度大于等于k且首字符为c1的左边界个数)。每次统计后,i++,j++
,保证了两指针始终相距k。
前项指针i遍历到尾字符为c2时,sum+=cl_sum
, 表示i位置为右边界,后面跟有c1_sum
个左边界符合条件。
以后前项指针i每次遍历到c2时,子串长度会更长,前面统计的左边界肯定都符合条件,直接加cl_sum即可。
代码
#include <bits/stdc++.h>
using namespace std;
int K;
long long ans=0,c1_sum=0;
string S;
char c1,c2;
int main(){cin>>K>>S>>c1>>c2;for(int i=K-1,j=0;i<S.size();i++,j++){if(S[j]==c1) c1_sum++;if(S[i]==c2) ans+=c1_sum;}cout<<ans;return 0;
}
每种字符至少取k个
问题描述
给你一个由字符 'a'
、'b'
、'c'
组成的字符串 s
和一个非负整数 k
。每分钟,你可以选择取走 s
最左侧 还是 最右侧 的那个字符。
你必须取走每种字符 至少 k
个,返回需要的 最少 分钟数;如果无法取到,则返回 -1
。
原题链接
思路分析
求最少分钟数就是求最少操作数,也就是最少取走的字符数。
由于每次只能取两侧的字符,最后保留的就是一个连续的子串。要使取走的字符数最少,相当于求最后满足条件的最长的子串。
遍历r,寻找满足条件的最小的l。
代码
int takeCharacters(string s, int k) {if(k==0)return 0;int n=s.size();int num[3]={0};for(int i=0;i<n;i++){++num[s[i]-'a']; //频数统计,全部取走}if(num[0]<k||num[1]<k||num[2]<k) return -1;int l=-1;int maxL=0; //求r,l的最大距离for(int r=0;r<n;r++){num[s[r]-'a']--; //放回//求最小的满足条件的l,当r加一时,小于l的左边界肯定不符和条件,所以l不用从0开始重新遍历.//此法相当于两次遍历s,时间复杂度为O(n)while(l<r&&(num[0]<k||num[1]<k||num[2]<k)){l++; num[s[l]-'a']++; //取走}maxL=max(maxL,r-l);}return n-maxL;
}
统计定界子数组的数目
问题描述
给你一个整数数组 nums
和两个整数 minK
以及 maxK
。
nums
的定界子数组是满足下述条件的一个子数组:
- 子数组中的 最小值 等于
minK
。 - 子数组中的 最大值 等于
maxK
。
返回定界子数组的数目。
子数组是数组中的一个连续部分。
原题链接
思路分析
首先考虑一个简单的情况,nums 的所有元素都在 [minK,maxK] 范围内。
在这种情况下,问题相当于:
同时包含 minK
和 maxK
的子数组的个数。
核心思路:枚举子数组的右端点i
,统计有多少个合法的左端点。
遍历 nums,记录 minK 离 i 最近的位置 minI,以及 maxK 离 i 最近的位置 maxI,当遍历到 nums[i] 时,如果 minK 和 maxK 都遇到过,则左端点在 [0,min(minI,maxI)]
范围中的子数组,包含 minK 和 maxK,最小值一定是 minK,最大值一定是 maxK。
以 i 为右端点的合法子数组的个数为:min(minI,maxI)+1
回到原问题,由于子数组不能包含在 [minK,maxK]
范围之外的元素,我们需要额外记录在 [minK,maxK]
范围之外的离 i 最近的位置,记作 i0,则左端点在 [i0+1,min(minI,maxI)]
中的子数组都是合法的。
以 i 为右端点的合法子数组的个数为min(minI,maxI)−i0
代码
long long countSubarrays(vector<int>& nums, int minK, int maxK) {long long ans = 0;int min_i = -1, max_i = -1, i0 = -1;for (int i = 0; i < nums.size(); i++) {int x = nums[i];if (x == minK) {min_i = i; // 最近的 minK 位置}if (x == maxK) {max_i = i; // 最近的 maxK 位置}if (x < minK || x > maxK) {i0 = i; // 子数组不能包含 nums[i0]}ans += max(min(min_i, max_i) - i0, 0); //若i0大于min(min_i, max_i),则取不到合法子数组}return ans;
}
作者:灵茶山艾府
最高频元素的频数
问题描述
元素的 频数 是该元素在一个数组中出现的次数。
给你一个整数数组 nums
和一个整数 k
。在一步操作中,你可以选择 nums
的一个下标,并将该下标对应元素的值增加 1
。
执行最多 k
次操作后,返回数组中最高频元素的 最大可能频数 。
原题链接
思路分析
首先直接一点思考,枚举每个数作为最高频的那个数x,看看通过最多k次操作最多能有多少个数变成x,更新最大频数ans,最后的ans就是答案。因为操作是对选取的数加1,所以只需考虑操作比x小的数,选取的数应该小于x且尽量大,这样便可以尽可能操作更多的数。
对于以上分析,我们可以先对数组按升序排序,从左到右遍历,选取当前枚举数为最高频的数,再从当前数开始向左反向遍历确定操作后的最大频数,最后维护更新的ans就是答案。
代码
int maxFrequency(vector<int>& nums, int k) {sort(nums.begin(),nums.end());int ans=1,n=nums.size();long long sum=0;int j=0;for(int i=1;i<n;i++){int t=k;for(int j=i-1;j>=0;j--){t-=nums[i]-nums[j];if(t>=0) ans=max(ans,i-j+1);else break;}}return ans;}
上述代码两次循环,最大复杂度还是来到了O(n^2),数据规模大,最后超时了,需要优化.
上述代码中,每次枚举一个nums[i]
都向左遍历,其实要计算以当前nums[i]
为k
的ans
值,可以借助前一个计算的结果。
定义j指针为前一个nums[i]
往左遍历的截止点,求nums[i+1]
对应的j指针时,因为nums[i+1]大于等于nums[i]
,其对应的j指针不可能更小,只会更大(请读者自行分析),因此只需在原有的j指针上往右移动即可。算法相当于对数组最多两次遍历,时间复杂度为O(n)。
代码
int maxFrequency(vector<int>& nums, int k) {sort(nums.begin(),nums.end());int ans=1,n=nums.size();long long sum=0;int j=0;for(int i=1;i<n;i++){sum+=(long long)(nums[i]-nums[i-1])*(i-j);while(sum>k){sum-=nums[i]-nums[j];j++;}ans=max(i-j+1,ans);}return ans;}
两端向中间收缩
接雨水
接雨水问题可以称的上指针尺取法中反向扫描的经典例题
问题描述
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
例图
原题链接
思路分析
定义左右指针l,r
,初始l=0,r=height.size()-1
;
每次判断height[l]<height[r]
则 l++
,否则 r++
,直到l==r
;
- 当
height[l]<height[r]
时可以确定l
从左到右遍历过程中子数组[0,l]的最大值lmax<height[r]
此时对于下标l
处表示的雨水量是 lmax(子数组[0,l]的最大值)-height[l]
。
- 反之 当height[l]>=height[r]时可以确定
r
从 右到左遍历过程中子数组[r,n-1]的最大值rmax<=height[l]
此时对于下标r
处表示的雨水量是 rmax(子数组[r,n-1]的最大值)-height[r]
。
代码
int trap(vector<int>& height) {int ans=0;int l=0,r=height.size()-1;int lmax=0,rmax=0;while(l<r){lmax=max(height[l],lmax);rmax=max(height[r],rmax);if(height[l]<height[r]){ans+=lmax-height[l];l++;}else{ans+=rmax-height[r];r--;}}return ans;}
中间向两端扩散
包含k下标元素的子数组的最大容量
问题描述
给你一个整数数组 nums
**(下标从 0 开始)**和一个整数 k
。
一个子数组 (i, j)
的 容量 定义为 min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1)
。
请你返回子数组(i,j)
(i<=k<=j) 的最大可能 容量 。
1 <= nums.length <= 10^5
1 <= nums[i] <= 2 * 10^4
0 <= k < nums.length
原题链接
思路分析
由于子数组必须包含nums[k]
,可以定义两个指针left,right,初始时left=k-1
,right=k+1
,ans=k
;
所有目标子数组中最大的min
值为nums[k]
,最小的min
值为数组nums
的最小值,
从[1,nums[k]]范围中每次枚举最小值i,初始枚举nums[i]
,然后依次减1;
向左移动left,直到nums[left]<i或left<0
向右移动right,直到nums[right]<i或ritgh>=n(n为nums数组大小)
此时的子数组[left+1,right-1]是最小值为i的最长目标子数组,记录其容量(right-left-1)*i,用它更新历史最大容量。
当i继续减少,而指针没有移动时,此时(right-left-1)不变,i减少,ans=(right-left-1)*i比上阶段所求更小,所以历史最大容量不会改变。
直到枚举到left<0且ritgh>=n,此时的历史最大容量值即为正确答案。
时间复杂度O(n+C),C为nums中元素的取值范围。
代码
class Solution {
public:int maximumScore(vector<int>& nums, int k) {int n = nums.size();int left = k - 1, right = k + 1;int ans = 0;for (int i = nums[k];; --i) {while (left >= 0 && nums[left] >= i) {--left;}while (right < n && nums[right] >= i) {++right;}ans = max(ans, (right - left - 1) * i);if (left == -1 && right == n) {break;}}return ans;}
};
优化
上述代码效率较低的原因是在 i 比 (left,right) 中的最小值更小,但指针没有移动时,计算出的分数是没有意义的。
指针没有移动的原因是 nums[left] 和 nums[right] 都小于 i。
此时我们应当直接把 i 减小至二者的较大值,而不是每次减少 1,这样就可以保证每一次循环中都至少会移动一次指针,就可以将 C 从时间复杂度中移除,总时间复杂度为O(n)
细节
在减少 i 时,需要注意指针已经超出数组边界的情况。
代码
int maximumScore(vector<int>& nums, int k) {int n = nums.size();int left = k - 1, right = k + 1;int ans = 0;for (int i = nums[k];;) {while (left >= 0 && nums[left] >= i) {--left;}while (right < n && nums[right] >= i) {++right;}ans = max(ans, (right - left - 1) * i);if (left == -1 && right == n) {break;}i = max((left == -1 ? -1 : nums[left]), (right == n ? -1 : nums[right]));}return ans;}
指向不同容器的指针尺取
寻找右区间
问题描述
给你一个区间数组 intervals
,其中 intervals[i] = [starti, endi]
,且每个 starti
都 不同 。
区间 i
的 右侧区间 是满足 startj >= endi
,且 startj
最小 的区间 j
。注意 i
可能等于 j
。
返回一个由每个区间 i
对应的 右侧区间 下标组成的数组。如果某个区间 i
不存在对应的 右侧区间 ,则下标 i
处的值设为 -1
。
原题链接
代码
vector<int> findRightInterval(vector<vector<int>>& intervals) {vector<pair<int, int>> start; //将intervals拆分为两个数组vector<pair<int, int>> end;int n = intervals.size();for(int i=0; i<n; i++){start.emplace_back(intervals[i][0], i);end.emplace_back(intervals[i][1], i);}sort(start.begin(), start.end());sort(end.begin(), end.end());vector<int> res(n, -1);auto e_iter = end.begin(), s_iter = start.begin(); //两个指针while(e_iter != end.end()){while(s_iter != start.end() && s_iter->first < e_iter->first){s_iter++;}if(s_iter == start.end()) break;res[e_iter->second] = s_iter->second;e_iter++;}return res;}
多指针
统计好三元组的数目
问题描述
给你一个整数数组 arr
,以及 a
、b
、c
三个整数。请你统计其中好三元组的数量。
如果三元组 (arr[i], arr[j], arr[k])
满足下列全部条件,则认为它是一个 好三元组 。
0 <= i < j < k < arr.length
|arr[i] - arr[j]| <= a
|arr[j] - arr[k]| <= b
|arr[i] - arr[k]| <= c
其中 |x|
表示 x
的绝对值。
返回 好三元组的数量 。
原题链接
代码
int countGoodTriplets(vector<int>& arr, int a, int b, int c) {int n=arr.size(),ans=0;vector<int>ids(n);ranges::iota(ids,0);ranges::sort(ids,{},[&](int i){return arr[i];});for(int j:ids){vector<int>left,right;for(int i:ids){if(i<j&&abs(arr[i]-arr[j])<=a) left.push_back(arr[i]);}for(int k:ids){if(k>j&&abs(arr[k]-arr[j])<=b) right.push_back(arr[k]);}int s1=0,s2=0;for(int value:left){while(s2<right.size()&&right[s2]-value<=c) s2++;while(s1<right.size()&&right[s1]-value<-c) s1++;ans+=s2-s1;}}return ans;
}
相关文章:
014枚举之指针尺取——算法备赛
枚举是数据结构与算法中基本的操作,常用于解决序列的区间问题。算法界将"双指针"视为其重要分支,类似地当然还有"三指针",“四指针”,最常见的还是“双指针”,我认为它们应统称为“指针尺取”。 双…...
Python小酷库系列:bidict,可以双向查询的dict
bidict,可以双向查询的dict 基本使用创建双向字典正向查找(key → value)反向查找(value → key)添加新项删除项 进阶功能使用 ~ (.inverse)获取逆映射使用 namedbidict 创建具名双向字典批量更…...
Android Compose 中 CompositionLocal 的全面解析与最佳实践
CompositionLocal 在 Android Compose 中的详细总结 核心概念 CompositionLocal 是 Jetpack Compose 提供的一种隐式数据传递机制,允许数据在组件树中向下传递,而无需显式地通过每个 Composable 函数的参数传递。 两种创建方式 1. staticComposition…...
Qt开发:容器组控件的介绍和使用
文章目录 一、Group Box(分组框)1.1 QGroupBox 简介1.2 基本用法1.3 设置为可勾选(可启用/禁用子控件)1.4 信号与槽连接(监控勾选状态)1.5 布局示例(完整) 二、Scroll Areaÿ…...
JS逆向入门案例1——集思录登录
JS逆向入门案例1——集思录登录 前言声明网站流程分析总结 前言 由于这段时间本职工作比较繁忙,没有很多空余的时间去研究各大厂的加密风控了,想起来自己刚接触js逆向走过坎坷,所以决定出一期js入门案例分析,为刚接触js逆向的小伙…...
ARM子程序和栈
微处理器中的栈由栈指针指向存储器中的栈顶来实现,当数据项入栈时,栈 指针向上移动,当数据项出栈时,栈指针向下移动。 实现栈时需要做出两个决定:一是当数据项进栈时是向低位地址方向向上生 长(图a和图b&a…...
笔试专题(十五)
文章目录 排序子序列题解代码 消减整数题解代码 最长公共子序列(二)题解代码 排序子序列 题目链接 题解 1. 贪心 模拟 2. 1 2 3 2 2 应该是有两个排列子序列的,所以i n-1时ret 3. 把水平的位置和上升部分,水平位置和下降部分分为一个排列子序列 代…...
使用OpenCV 和 Dlib 进行卷积神经网络人脸检测
文章目录 引言1.准备工作2.代码解析2.1 导入必要的库2.2 加载CNN人脸检测模型2.3 加载并预处理图像2.4 进行人脸检测2.5 绘制检测结果2.6 显示结果 3.完整代码4.性能考虑5.总结 引言 人脸检测是计算机视觉中最基础也最重要的任务之一。今天我将分享如何使用dlib库中的CNN人脸检…...
某信服EDR3.5.30.ISO安装测试(一)
一、前言 1.某信服EDR3.5.30 以下简称“EDR3.5”,即统一端点安全管理系统aES(终端检测响应EDR), 官网最新版:aES6.0.1R2,可下载的最低版本:EDR3.7.11R3, 下载地址:统一端点安全管理系统aES-…...
Dify 快速构建和部署基于LLM的应用程序
本文先对Dify做一个初步的认识,然后以一个实际的简单金融问答案例,配置chatflow 工作流。 一、Dify简介 如果你是第一次接触Dify,可以先创建一个简单的聊天助手,初步感觉一下,Dify在构建聊天问答类应用的过程。 比如…...
精益数据分析(40/126):移动应用商业模式的关键指标与盈利策略
精益数据分析(40/126):移动应用商业模式的关键指标与盈利策略 在创业和数据分析的探索之路上,我们持续挖掘不同商业模式的内在规律,以寻求更好的发展机遇。今天,我们依旧秉持共同进步的理念,深…...
JavaScript 实现输入框的撤销功能
在 Web 开发中,为输入框添加撤销功能可以极大地提升用户体验,方便用户快速回滚到之前的输入状态。本文将通过一段简单的 HTML、CSS 和 JavaScript 代码,详细介绍如何实现输入框的撤销功能。 整体实现思路 利用 JavaScript 监听输入框的inpu…...
【C++】类和对象(一)
前言 类和对象第一部分知识包括定义访问限定符类域实例化this指针 本人其他文章:恋风诗 文章中的源码[gitte]:mozhengy 类和对象(一) 前言1. 类的定义引例1.1 类定义格式1.2 类的访问限定符1.3 类域 2. 实例化2.1 实例化概念2.2 …...
【Vue】Vue3源码解析与实现原理
个人主页:Guiat 归属专栏:Vue 文章目录 1. Vue 3 架构概览1.1 模块化设计1.2 整体流程 2. 响应式系统2.1 响应式原理2.2 ref 和 reactive2.3 依赖收集与触发更新 3. 渲染系统3.1 虚拟DOM设计3.2 渲染管线3.3 Patch算法与Diff优化 4. 组件系统4.1 组件创建…...
黑马点评day02(缓存)
2、商户查询缓存 2.1 什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震…...
数据库MySQL学习——day9(聚合函数与分组数据)
文章目录 1. 聚合函数1.1 COUNT() 函数1.2 SUM() 函数1.3 AVG() 函数1.4 MIN() 函数1.5 MAX() 函数 2. GROUP BY 子句2.1 使用 GROUP BY 进行数据分组2.2 结合聚合函数 3. HAVING 子句3.1 使用 HAVING 过滤分组数据3.2 HAVING 和 WHERE 的区别 4. 实践任务4.1 创建一个销售表4.…...
为React组件库引入自动化测试:从零到完善的实践之路
为什么我们需要测试? 我们的ReactTypeScript业务组件库已经稳定运行了一段时间,主要承载各类UI展示组件,如卡片、通知等。项目初期,迫于紧张的开发周期,我们暂时搁置了自动化测试的引入。当时团队成员对组件逻辑了如指…...
数据结构——算法复杂度
一、数据结构定义 数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希…...
Vue3响应式原理那些事
文章目录 1 响应式基础:Proxy 与 Reflect1.1 Proxy 代理拦截1.2 Reflect 确保 `this` 指向正确1.2.1 修正 `this` 指向问题1.2.2 统一的操作返回值1.3 与 Vue2 的对比2 依赖收集与触发机制2.1 全局依赖存储结构:WeakMap → Map → Set2.2 依赖收集触发时机2.3 依赖收集核心实…...
记9(Torch
目录 1、Troch 1、Troch 函数说明举例torch.tensor()torch.arange()创建张量创建一个标量:torch.tensor(42)创建一个一维张量:torch.tensor([1, 2, 3])创建一个二维张量:torch.tensor([[1, 2], [3, 4]])生成一维等差张量:语法&am…...
机器学习模型训练模块技术文档
一、模块结构概览 import numpy as np from sklearn.model_selection import cross_validate, learning_curve from sklearn.pipeline import make_pipeline from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing imp…...
健康养生:从微小改变开始
养生不必大刀阔斧,几个微小改变,就能让健康慢慢扎根生活。晨起别急着洗漱,先花 5 分钟靠墙站立,拉伸脊柱、调整体态,唤醒身体。早餐把白米粥换成杂粮粥,搭配水煮蛋和一小碟凉拌黄瓜,营养更全面。…...
某信服EDR3.5.30.ISO安装测试(二)
一、物理机启动EDR 1、修复dracut 使用DiskGenius克隆虚拟磁盘到物理磁盘,将虚拟机移植到物理机,因为磁盘UUID变化等原因,首次默认启动失败,提示: Starting Dracut Emergency Shell... Warning:/dev/centos/root doe…...
Leetcode:回文链表
1、题目描述 给定一个链表的 头节点 head ,请判断其是否为回文链表。 如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。 示例 1: 输入: head [1,2,3,3,2,1] 输出: true 示例 2: 输入: head [1,2] 输出: …...
IL2CPP 技术深度解析
IL2CPP 是 Unity 开发的高性能脚本后端,它将 .NET 的中间语言 (IL) 转换为 C 代码,再编译为原生平台二进制文件。以下是 IL2CPP 的全面技术剖析。 一、架构设计原理 1. 整体编译流程 C# 源代码 → Roslyn 编译器 → IL (.NET DLL)→ IL2CPP 转换器 →…...
AI图片修复工具,一键操作,图片更清晰!
泛黄的老相册里藏着一座记忆博物馆,每张照片都是时光长河中的琥珀。祖父军装照上的折痕里藏着抗美援朝的故事,父母结婚照褪色的红唇映照着八十年代的风尚,童年抓拍照上模糊的身影正重演着我们成长的轨迹。这些承载着集体记忆的影像࿰…...
国内短剧 vs. 海外短剧系统:如何选择?2025年深度对比与SEO优化指南
在短剧市场爆发式增长的背景下,国内与海外短剧系统成为创业者与企业的热门选择。本文将从市场潜力、开发成本、内容创作、盈利模式及风险五大维度,结合最新行业数据与案例,深度解析两者的优劣势,助您做出最优决策。 一、市场前…...
linux crash工具详解
crash 是 Linux 系统中用于分析内核转储文件(如 vmcore 或 kdump 生成的 dump 文件)的核心工具。它结合了调试符号和内核数据结构,能够直观地查看崩溃时的系统状态。以下是其详细使用方法及核心功能解析: 一、安装与准备 1. 安装…...
Scala day6(Class,field,Single Object)
Foreword【こんにちは】 Today, we continue to learn Scala Language, though the Scala isn’t easy for Begainner, Big Data Technology need Scala Language, Spark【Distributed Calculation FrameWork】is based on Scala Language designed. I know the learning road…...
不小心把当前的环境变量路径覆盖掉怎么办
起因 配置环境变量(~/.bashrc)的时候没加:$PATH,导致 source ~/.bashrc之后只剩下刚刚配置的环境变量了。连vim都打不开 解决 添加临时环境变量export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH再重新修改…...
unity TMP字体使用出现乱码方框
参考文章: Unity 设置默认字体(支持老版及新版TMP)_unity tmp字体-CSDN博客 原因是导入的项目package包没有连着tmp一起,这样在新工程中导入的tmp字体默认的是tmp自己的,解决方案就是替换成自己需要的tmp字体就行 替换…...
14.网络钓鱼实战
网络钓鱼实战 第一部分:网络钓鱼攻击详解第二部分:设计与分析钓鱼攻击第三部分:钓鱼攻击防范实践总结 目标: • 深入理解网络钓鱼攻击的实施过程 • 掌握设计和识别钓鱼攻击的技巧 • 通过模拟实践提升防范钓鱼攻击的能力 第一部分…...
pyqt写一个单片机配置界面
已经实现以下功能 1.可以选择单片机架构 2.选择完单片机架构后第二个框可以选择常见单片机型号 3.选择完常见单片机型号后第三个框可以选择内部资源如adc等(可以选择多个内部资源)4.选择完内部资源如adc等(可以选择多个内部资源)后…...
「Mac畅玩AIGC与多模态20」开发篇16 - 使用结构化输出字段控制后续流程示例
一、概述 本篇介绍如何在工作流中使用结构化输出字段作为判断依据,实现前后节点联动控制。通过执行 LLM 节点输出结构化 JSON,并使用其中的字段驱动后续判断节点执行不同路径,开发人员将掌握结构化字段在工作流中的引用方式与分支控制技巧。…...
Unity-Shader详解-其四
今天我们来聊Unity特有的表面着色器以及很少提到的几何着色器。 表面着色器 在前文关于光照的计算中,我们学会了很多:我们学习了一系列光照模型,比如专门针对漫反射的兰伯特模型和改进的半兰伯特模型,又比如由高光、漫反射和环境…...
Lua 元表和元方法
元表(Metatable)和元方法(Metamethod)是Lua中实现面向对象编程、操作符重载和自定义行为的重要机制。 元表 元表是一个普通的Lua表,可以附加到另一个表上,用于定义或修改该表的行为。每个表都可以有自己的元表。 setmetatable(tab,metatab) 将metatab设…...
GESP2024年3月认证C++八级( 第二部分判断题(6-10))
海伦公式参考程序: #include <iostream> #include <cmath> // 引入cmath库以使用sqrt函数using namespace std;double calculateTriangleArea(int a, int b, int c) {// 使用海伦公式double s (a b c) / 2.0; // 半周长return sqrt(s * (s - a) *…...
Nacos源码—3.Nacos集群高可用分析一
大纲 1.Nacos集群的几个问题 2.单节点对服务进行心跳健康检查和同步检查结果 3.集群新增服务实例时如何同步给其他节点 4.集群节点的健康状态变动时的数据同步 5.集群新增节点时如何同步已有服务实例数据 1.Nacos集群的几个问题 问题一:在单机模式下ÿ…...
信息系统项目管理师-软考高级(软考高项)2025最新(九)
个人笔记整理---仅供参考 第九章项目范围管理 9.1管理基础 9.2项目范围管理过程 9.3规划范围管理 9.4收集需求 9.5定义范围 9.6创建WBS 9.7确认范围 9.8控制范围...
DeepSeek学术论文写作全流程指令
一、选题与领域界定 研究热点捕捉 指令: “在[研究领域]中,现有文献对[具体问题]的[哪方面]研究不足?基于近5年文献归纳3个待突破方向,需结合高频关键词和交叉学科维度。” 示例: “在深度学习医疗影像分析中,现有文献对小样本训练的泛化性研究不足?基于2019-2023年顶会…...
【ArUco boards】标定板检测
之前定位用的Charuco标定板做的(https://blog.csdn.net/qq_45445740/article/details/143897238),因为实际工况中对标定板的尺寸有要求,大概是3cm*2cm这个尺寸,加上选用的是ChAruco标定板,导致每一个aruco码…...
2025 年 408 真题及答案
2025 年 408 真题 历年408真题及答案下载直通车 1、以下 C 代码的时间复杂度是多少?() int count 0; for (int i0; i*i<n; i)for (int j0; j<i; j)count;A O(log2n)B O(n)C O(nlogn)D O(n2) 2、对于括号匹配问题,符号栈…...
设计模式每日硬核训练 Day 18:备忘录模式(Memento Pattern)完整讲解与实战应用
🔄 回顾 Day 17:中介者模式小结 在 Day 17 中,我们学习了中介者模式(Mediator Pattern): 用一个中介者集中管理对象之间的通信。降低对象之间的耦合,适用于聊天系统、GUI 控件联动、塔台调度等…...
ByteArrayOutputStream 类详解
ByteArrayOutputStream 类详解 ByteArrayOutputStream 是 Java 中用于在内存中动态写入字节数据的输出流(ByteArrayOutputStream和ByteArrayInputStream是节点流),位于 java.io 包。它不需要关联物理文件或网络连接,所有数据都存储在内存的字节数组中。 1. 核心特性 内存缓冲…...
Linux中web服务器的部署及优化
前言:Nginx 和 Apache HTTP Server 是两款非常流行的 Web 服务器。 Nginx 简介:Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。由俄罗斯人伊戈尔・赛索耶夫开发,其在处…...
使用Mathematica绘制Sierpinski地毯
在Mathematica中内置的绘制Sierpinski地毯的函数: SierpinskiCurve[n] gives the line segments representing the n-step Sierpiński curve. 注意,直接运行这个函数,返回的是Line对象,例如: 运行如下代码…...
Qt 信号槽机制底层原理学习
简介 Qt的信号和槽(Signals and Slots)是Qt开发团队创造的一种特殊回调机制,提供了非常简洁易用的事件触发-函数调用机制。 原理学习 虽然上层使用简单,但底层实现机制却复杂的不得了,这里简单的学习一下大概原理。…...
【Java学习笔记】包
包(package) 包的本质:实际上就是创建不同的文件夹或者目录来保存类文件 包的三大作用 区分相同名字的类 当类很多的时候可以更方便的管理类 控制访问范围 使用方法 关键字:import—>导入(引入) …...
进程的程序替换——exec系列函数的使用
目录 前言 一、替换函数 二、程序替换的本质 一些细节: 三、程序替换与环境变量间的关系 1.介绍其他参数的意义并总结 2.自定义环境变量 1)通过execcle传参全局环境变量 2)通过execcle传参自定义环境变量 3)将自定义环境变量通过p…...
【论文阅读】DETR+Deformable DETR
可变形注意力是目前transformer结构中经常使用的一种注意力机制,最近补了一下这类注意力的论文,提出可变形注意力的论文叫Deformable DETR,是在DETR的基础上进行的改进,所以顺带着把原本的DETR也看了一下。 一、DETR DETR本身是…...