以题为例浅谈双指针算法

什么是双指针算法

双指针是指在遍历元素时,不是使用单个指针进行遍历而是使用两个指针进行访问,从而达到相应目的;注意这个指针不是c语言中那个指向地址的指针;

双指针分类

双指针分为对撞指针和快慢指针;

对撞指针:两个指针方向相反,例如你需要用两个指针去遍历一个数组,一个从数组起始点开始进行遍历,一个指针是从最后开始遍历;

快慢指针:快慢指针是方向相同,例如一个数组都是从数组起始的地方进行遍历或者都是从尾部进行遍历,快慢指针又称为弗洛伊德算法,兔子乌龟算法;

快慢指针常用判别链表中是否有环

接下来用题目详细介绍这两种算法

对撞指针

对撞指针常用于解决那些问题

有序数组两数之和

二分查找

三数之和(无序)

最接近的三数之和

有序数组两数之和

例题链接:. - 力扣(LeetCode)

题目描述:

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1]numbers[index2] ,则 1 <= index1 < index2 <= numbers.length

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 index2

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

先上代码

class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int i=0;int j=numbers.size()-1;while(i<j){int sum=numbers[i]+numbers[j];if(sum<target)i++;else if(sum>target)j--;elsereturn vector<int>{i+1,j+1};}return vector<int>{-1,-1};}
};

解释一下这段代码就是题目已经告诉我们按非递减顺序排好了,那就说明数组已经按照递增顺序排好了;接下来就是按照要求求和,这个数组右边是最大值,左边是最小值,那就设两个指针进行遍历,在这段代码中设的就是i和j,分别给i和j赋值,在这里,numbers[i]就是这个数组的最小值,numbers[j]就是这个数组的最大值,然后相加,将相加的值与目标值进行比较,如果小于目标值说明需要将值增大,就要将i向右移,因为右边的值大于左边的值,如果大于同理就要让这个值小一点,所以r向左移,如果相等说明找到了就返回;

三数之和(无序)

有人会疑惑,三数之和双指针怎么去满足,看看下面的题去解释

题目:三数之和

题目链接:. - 力扣(LeetCode)

题意:

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

示例:

输入: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] 。
注意,输出的顺序和三元组的顺序并不重要。

先看代码

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int n=nums.size();sort(nums.begin(),nums.end());vector<vector<int>> ans;for(int first=0;first<n;first++){if(first>0&&nums[first]==nums[first-1])continue;int third=n-1;int target=-nums[first];for(int second=first+1;second<n;second++){if(second>first+1&&nums[second]==nums[second-1])continue;while(second<third&&nums[second]+nums[third]>target){third--;}if(second==third)break;if(nums[second]+nums[third]==target)ans.push_back({nums[first],nums[second],nums[third]});}}return ans;}
};

在此解释一下这段代码,先将数组进行排序,排完之后在设置一个vector的容器;然后就是三层循环最主要的是那两个for循环,第一个for循环循环first的指向,将first不断向前移动,这里面的双指针分别是second和third,third赋值为n-1就是将third置为数组的最右边,将目标值减去nums[first]的值,那么目标值就是second和third值之和,然后开始进行移动两个指针,如果值大于目标1值说明需要third的值向左移因为左边的值要小,往左移,移到second等于third说明所有的值都大于目标值那直接就退出最里面的for循环说明在移second也没有用了因为second的值是往右移的,值一直增大,后面的值会更大于目标值target,找到符合的值就假如到ans容器中到最后进行返回;

 二分查找

二分查找就不再举例子了,因为二分查找中本来就蕴含了双指针的思想,他本来就设两个指针,一边是在数组的最左边,一个指针指向数组最右边,所以不再说了,这属于二分算法中的一环了;

快慢指针

快慢指针有龟兔赛跑的名字,非常的亲切;

快慢指针运用的领域

快慢指针可以利用在链表中也可以运用在数组中;

运用在链表中有以下几种运用的方式

1.判断环形链表

2.找出倒数第k个结点

3.找出链表中间结点

4.找到环形链表的的入口(进阶)

5. 相交链表

1.判断环形链表

题目链接:. - 力扣(LeetCode)

题意

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false

示例1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
bool hasCycle(struct ListNode *head) {if(head==NULL||head->next==NULL)return false;struct ListNode *slow=head,*fast=head->next;while(slow!=fast){if(fast->next==NULL||fast->next->next==NULL){return false;}fast=fast->next->next;slow=slow->next;}return true;
}

判断环形链表是快慢指针的典型题目,在有环链表如果它有环,快指针每次走两步,慢指针每次走一步那么有环他们必定相遇,注意一定要是快指针走两步,慢指针每次走一步,如果走别的步数可能就不能去辨别了;为什么呢?这里涉及到数学问题了,原来计算机的尽头真的是数学啊,

走一步,那么快指针比慢指针每次多走一步是1的倍数那么如何它们都会相遇;

如果快指针每次走三步那么,快指针每次比慢指针走2步,那么就不是1的倍数了,而一个奇数无论减几个偶数它都是奇数,它们就不会相遇,同样偶数也是如此,所以快慢指针中慢指针走一步而快指针走两步是最好的结果;

2.找出倒数第k个结点

题目链接:https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/description/

题意:给定一个头节点为 head 的链表用于记录一系列核心肌群训练项目编号,请查找并返回倒数第 cnt 个训练项目编号。

示例1:

输入:head = [2,4,7,8], cnt = 1
输出:8

代码:

    ListNode* trainingPlan(ListNode* head, int cnt) {ListNode* l,*r;l=r=head;if(head==NULL)return NULL;for(int i=0;i<cnt;i++)r=r->next;while(r!=nullptr){r=r->next;l=l->next;}return l;}

解释一下这段代码,就是让快指针先移步k个结点(注意代码中ans就是k),然后快指针与慢指针一起移动当快指针移到空的时候,慢指针到达的位置就是倒数第k个位置(倒数第ans个位置),为什么呢? 这里需要涉及相关的数学公式列方程

假如链表的长度是n,那么在头指针到这个位置就是(n-k),那么当一个指针移动n-k个位置时就到达了倒数第k个位置,那么快指针先移动了k个位置那它剩下的就是n-k个位置,那么这时候慢指针和快指针一起移动,当快指针为空的时候,慢指针就到达了第k个位置了;

3.找出链表中间结点

题目链接:. - 力扣(LeetCode)

题意:

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false

示例:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

代码:

    ListNode* deleteMiddle(ListNode* head) {if (head->next==nullptr) {  return nullptr;  }ListNode* r=head;ListNode* l=head;ListNode* pre=nullptr;while(l&&l->next){l=l->next;l=l->next;pre=r;r=r->next;}pre->next=pre->next->next;return head;}

解析一下这段代码,这个就是快指针走两步,慢指针走一步,那么当快指针走完之后,慢指针刚好到达中点;

下面举两个例子分别分析奇数和偶数个数的情况

当数是奇数个

1->2->3->4->5

快指针和慢指针都从1开始走,当快指针走到5的时候,慢指针刚好到达3也就是中间位置,这个时候快指针的条件就是r->next==NULL

当数的个数是偶数个时

1->2->3->4->5->6

快指针和慢指针都从1开始走,当快指针走到6后面的时候,慢指针刚好到达4满足条件的位置,这个时候,快指针的条件就是r==NULL;

所以这段代码整体的意思就影刃而解了

4.找到环形链表入口

题目链接:. - 力扣(LeetCode)

题意:

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false

示例:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

代码

    ListNode *detectCycle(ListNode *head) {ListNode *slow=head,*fast=head;while(fast!=nullptr){slow=slow->next;if(fast->next==nullptr)return nullptr;fast=fast->next->next;if(fast==slow){fast=head;while(fast!=slow){fast=fast->next;slow=slow->next;}return slow;}}return nullptr;}

在这里先解释一下这道题的原理:把环形链表讲清楚! 如何判断环形链表?如何找到环形链表的入口? LeetCode:142.环形链表II_哔哩哔哩_bilibili

这个视频解释的非常清楚不理解的可以看看,因为我这里没有图就不做多的解释了,本来想尝试画一下图感觉太抽象了;

解释一下这段代码吧,就是先看看这fast或者fast->next是不是为空,因为fast一下挑两格,所以有可能是fast为空也有可能fast->next为空,之后就是fast一下走两步,slow每次走一步,当slow和fast第一次相遇时将fast置为head,在此相遇时就是入口,这里还是数学公式的推导,视频里很详细;

5.相交链表

提名链接:. - 力扣(LeetCode)

题意:

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
  • listA - 第一个链表
  • listB - 第二个链表
  • skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
  • skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 headAheadB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案

示例1

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

代码

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA == nullptr || headB == nullptr) {return nullptr;}// 计算链表 A 和链表 B 的长度int lenA = 0, lenB = 0;ListNode *tempA = headA, *tempB = headB;while (tempA != nullptr) {lenA++;tempA = tempA->next;}while (tempB != nullptr) {lenB++;tempB = tempB->next;}// 将指针移动到使它们的长度相等的位置上tempA = headA;tempB = headB;if (lenA > lenB) {int diff = lenA - lenB;while (diff-- > 0) {tempA = tempA->next;}} else {int diff = lenB - lenA;while (diff-- > 0) {tempB = tempB->next;}}// 遍历链表直到找到交点while (tempA != nullptr && tempB != nullptr) {if (tempA == tempB) {return tempA;}tempA = tempA->next;tempB = tempB->next;}return nullptr; // 没有交点
}

解析一下这段代码

先通过循环求出两个链表的长度,然后让比较长的那个链表,先走一段距离使两个链表到最后的结点的长度是相同的,然后遍历两个链表,相等了就是相遇了就表示有交点,否则就没有交点;

题例

多说无益,以题见真章

这段题目是综合进阶的题目

逛画展

题目链接:逛画展 - 洛谷

题意:

博览馆正在展出由世上最佳的 mm 位画家所画的图画。

游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所有图画,而门票的价钱就是一张图画一元。

Sept 希望入场后可以看到所有名师的图画。当然,他想最小化购买门票的价格。

请求出他购买门票时应选择的 a,ba,b,数据保证一定有解。

若存在多组解,输出 aa 最小的那组

输入格式:

第一行两个整数 n,mn,m,分别表示博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。

第二行包含 nn 个整数 aiai​,代表画第 ii 幅画的名师的编号。

输出格式:

一行两个整数 a,ba,b。

输入输出样例

输入

12 5
2 5 3 1 3 2 4 1 1 5 4 3

输出

2 7

代码如下

#include<iostream>
using namespace std;
int cnt,ans,n,m,a[1000005],b[1000005],ansl,ansr;
void I(int x)
{if(b[x]==0){cnt++;}b[x]++;
}
void D(int x)
{if(b[x]==1){cnt--;}b[x]--; 
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}ans=n;for(int l=1,r=1;r<=n;r++){I(a[r]);while(true){D(a[l]);if(cnt==m)l++;else{I(a[l]);break;}	}if(cnt==m&&r+1-l<ans){ans=r+1-l;ansl=l;ansr=r;}}if(ansl!=0)cout<<ansl<<" "<<ansr;elsecout<<1<<" "<<ans;return 0;
}

这是一道快慢指针类型的题目;

解释一下代码,题目要求的是将全部画家的画包含在内并且要求包含的画最小,注意它只能按照顺序去看而不能跳级去看,那么就定义两个指针,两个指针都指向数组的开始,然后先向数组中添加一副画,然后r是一直向后移动的,然后就是将l这副画删除然后去判断是否满足条件,如果满足条件就将l指向的这幅画删除,如果不行在把这幅画添上,然后就这样一直判断最后输出相应的数组,其实我感觉这道题不是明确的快慢指针;

在进阶

统计子矩阵

这道题是用了二维数组,需要将它压缩为一维数组之后,在进行指针移动

题目链接:[蓝桥杯 2022 省 B] 统计子矩阵 - 洛谷

题意:

给定一个 N×MN×M 的矩阵 AA,请你统计有多少个子矩阵 (最小 1×11×1, 最大 N×M)N×M) 满足子矩阵中所有数的和不超过给定的整数 KK。

输入格式:

第一行包含三个整数 N,MN,M 和 KK。

之后 NN 行每行包含 MM 个整数, 代表矩阵 AA。

输出格式:

一个整数代表答案。

输入输出样例

输入

3 4 10
1 2 3 4
5 6 7 8
9 10 11 12

输出

19

代码如下

#include<iostream>
#define int long long
using namespace std;
int a[505][505],s[505][505],ans;
int b[505];
signed main()
{int n,m,k;cin>>n>>m>>k;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cin>>a[i][j];}for(int j=1;j<=m;j++){for(int i=1;i<=n;i++)s[i][j]=s[i-1][j]+a[i][j];}  //求行之间的前缀和for(int ii=1;ii<=n;ii++){for(int i=ii;i<=n;i++){for(int j=1;j<=m;j++){b[j]=s[i][j]-s[ii-1][j];}int l=1,r=0,sum=0;while(r<m){r++;sum+=b[r];if(sum<=k)ans+=(r-l+1);else{while(sum>k){sum-=b[l];l++;}ans+=(r-l+1);}}}}cout<<ans;return 0;
}

解释一下这段代码算是快慢指针中的一道类型题吧

先将二维数组按列求出前缀和,然后用三个嵌套循环,前两个循环用于行之间的相减,最后一个循环用于列之间的相减,就是行之间对应进行相减就是s[1][1]-s[0][1]以此类推,将它们的值加入到一个一维数组当中,它这个循环就是先是第一行的值减第零行的值,之后就是将第二行的值减去第零行的值.....之后第二行减第一行,第三行减去第一行;之后得到一个一维数组,在用两个指针,进行遍历,第一个指针在前面如果两个位置在的数组的数相减小于k那就加上r-l+1,为啥加一因为r从0开始的,也就是快指针从0开始的而慢指针是从0开始的,为什么是r-l,注意这个数组代表的前缀和,所以当这两个区间相加小于目标值那么原来这个数组它本身的值就小于目标值;

双指针就先到这了,自我感觉总结的并不好,感觉有的知识点知道但是不知道这么说,我在研究研究将它完善完善;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/760845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JetBrains全家桶激活,分享 IntelliJ IDEA 2024 激活的方案

大家好&#xff0c;欢迎来到金榜探云手&#xff01; IDEA 公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 WebStorm等。这些工具被…

Vulnhub靶机:Kioptrix_2014

一、介绍 运行环境&#xff1a;Virtualbox和vmware 攻击机&#xff1a;kali&#xff08;192.168.56.101&#xff09; 靶机&#xff1a;Kioptrix: 2014&#xff08;192.168.56.108&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://ww…

mac硬盘拷贝到另外硬盘 苹果电脑怎么拷贝到移动硬盘

在当今的信息时代&#xff0c;数据的存储和传输是我们日常生活和工作中不可或缺的一部分。我们经常需要使用各种硬盘来保存和备份我们的数据&#xff0c;比如内置硬盘、移动硬盘、U盘等。但是&#xff0c;不同的硬盘可能使用不同的文件系统&#xff0c;这给我们的数据拷贝带来了…

【SpringSecurity】十七、OAuth2授权服务器 + 资源服务器Demo

文章目录 0、库表准备1、项目结构2、基于数据库的认证3、授权服务器配置4、授权服务器效果测试5、资源服务器配置6、其他授权模式测试6.1 密码模式6.2 简化模式6.3 客户端模式6.4 refresh_token模式 相关&#x1f4d5;&#xff1a;【Spring Security Oauth2 配置理论部分】 0、…

《InfMAE: A Foundation Model in Infrared Modality》CVPR2024

基础模型vs大模型&#xff1a;大模型&#xff0c;也称基础模型&#xff0c;是指具有大规模参数和复杂计算结构的机器学习模型 以后的研究中必须把大模型和基础模型耦合进来 总结&#xff1a;占坑 1. AB 多光谱的基础模型 红外的基础模型 可见光的基础模型 整体架构差不多…

微信小程序小案例实战

.wxml: <view class "title">狂飙经典语录 </view> <view class"out"><block wx:if"{{listArr.length}}"> <!-- bloock不会影响排版--><view class"list"><view class"row" wx:…

mysql性能调优

mysql性能调优 sysbench压测调优到百万级别qps sysbench压测调优到百万级别qps 这篇文章https://www.percona.com/blog/millions-queries-per-second-postgresql-and-mysql-peaceful-battle-at-modern-demanding-workloads/#:~:textWe%20contacted%20SysBench%20author%20Alex…

seata安装

seara-Server下载 数据库建库seata 建表SQL地址:https://github.com/apache/incubator-seata/blob/develop/script/server/db/mysql.sql 表结构: 更改配置: # Copyright 1999-2019 Seata.io Group. # # Licensed under the Apache License, Version 2.0 (the "Licens…

Java学习笔记NO.24

T1.完成理工超市系统的商品类及其子类的定义&#xff0c;实现“浏览商品”及“查看商品详情”功能 &#xff08;1&#xff09;商品类 public class Goods {public String name;public double price;public int count;public String desc;public Goods(String name, double p…

ORA-02270-此列列表的唯关键字或主键不匹配

学习场景 数据库约束学习 -- 主表 班级表 create table classinfo(cid number(4), -- 班级编号cname varchar2(100), -- 班级名称cyear number(4), -- 入学年份clen number(1) -- 学制 );-- 从表 学生表 create table stuInfo(stuNo number(10) primary key, cid number(4)…

C语言经典算法-6

文章目录 其他经典例题跳转链接31.数字拆解32.得分排行33.选择、插入、气泡排序34.Shell 排序法 - 改良的插入排序35.Shaker 排序法 - 改良的气泡排序 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三角形 4. 三色棋 5. 老鼠走迷官&#xff08;一&…

《C语言深度剖析》---------关键字(1)

1.双击实质--->加载内存 windows系统里面&#xff0c;双击的本质就是运行程序&#xff0c;把程序加载到内存里面&#xff1b; 任何程序运行的时候都必须加载到内存里面&#xff1b; 程序没有运行之前在硬盘里面&#xff0c;为什么程序运行之前必须加载到内存里面呢&#…

【Apache ShenYu源码】如何实现负载均衡模块设计

ShenYu是一个异步的&#xff0c;高性能的&#xff0c;跨语言的&#xff0c;响应式的 API 网关。有关ShenYu的介绍可以戳这。 一、前瞻 今天我们尝试不同的代码阅读方式&#xff0c;按模块来去阅读源码&#xff0c;看看效果如何。 本次阅读锁定在shenyu-loadbalancer&#xf…

比较基因组——还是看我的教程吧!

一、运行orthofinder 首先 orthofinder使用的版本为2.5.* 不要使用2.2的&#xff0c;2.2默认比对是blast&#xff0c;速度非常慢&#xff0c;结果文件呈现形式也不让人满意。2.5默认用的diamond 速度非常快 第一步代码&#xff1a; nohup orthofinder -t 40 -f data/ & # …

【网页实战项目设计】基于SSM的医院预约挂号系统

基于SSM的医院预约挂号系统 项目截图 开发环境与技术框架 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&a…

实战whisper第二天:直播语音转字幕(全部代码和详细部署步骤)

直播语音实时转字幕&#xff1a; 基于Whisper的实时直播语音转录或翻译是一项使用OpenAI的Whisper模型实现的技术&#xff0c;它能够实时将直播中的语音内容转录成文本&#xff0c;甚至翻译成另一种语言。这一过程大致分为三个步骤&#xff1a;捕获直播音频流、语音识别&#x…

在线教育话术(1W字精选)

产品结构图 Nginx实现代理 问&#xff1a;我们在本机的host文件中配置了域名映射&#xff0c;都是同一个服务器。我们只需要输入对应的域名就可以到对应的界面&#xff0c;这是怎么实现的&#xff1f; 答&#xff1a;主要就是通过Nginx反向代理来实现的&#xff0c;Nginx会先…

2024-03-20 作业

作业要求&#xff1a; 1> 创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资。 2> 添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3> 修改某一个工人的薪资&#xff08;确定的一个&#x…

电影aac是什么意思?如何播放、转换、编辑aac?

"电影AAC"这个术语可能是指电影中的音频编码格式。AAC&#xff08;Advanced Audio Coding&#xff09;是一种常见的音频编码格式&#xff0c;通常用于压缩音频文件&#xff0c;以在保持高质量的同时减小文件大小。在电影中&#xff0c;AAC格式的音频通常用于提供高质…

Java学习笔记NO.25

T2.编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。可以弹奏的乐器包括二胡、钢琴和琵琶。要求&#xff1a; (1)定义乐器类Instrument&#xff0c;包括方法makeSound() (2)定义乐器类的子类&#xff1a;二胡Erhu、钢琴Piano和小提琴Violin (3)定义乐手类…