数据结构修炼——顺序表和链表的OJ题练习

目录

  • 一、顺序表相关OJ题
    • 1 移除元素
      • 题目解析
    • 2 合并两个有序数组
      • 题目解析
  • 二、链表相关OJ题
    • 1 移除链表元素
      • 题目解析
    • 2 反转链表
      • 题目解析
    • 3 链表的中间结点
      • 题目解析
    • 4 合并两个有序链表
      • 题目解析
    • 5 链表的回文结构
      • 题目解析
    • 6 相交链表
      • 题目解析
    • 7 环形链表的判断
      • 题目解析
    • 8 环形链表
      • 题目解析

一、顺序表相关OJ题

顺序表的实现与数组息息相关,不可分割,一些顺序表相关的算法实际上就是数组相关的算法,因此顺序表的灵活运用需要我们更深一步的理解与掌握数组。

1 移除元素

leetcode 27. 移除元素
在这里插入图片描述

题目解析

题目大意:
给定一个值val,数组中不等于val的元素个数为k(k >= 0 && k <= numsSize),我们需要将数组中所有等于val的元素删除或者移到数组后面,并求出k值返回。

代码示例如下:

int removeElement(int* nums, int numsSize, int val)
{int l1, l2;l1 = l2 = 0;while (l2 < numsSize){if (nums[l2] == val){l2++;}else{nums[l1] = nums[l2];l1++;l2++;}}return l1;
}

这里给出的思路类似双指针法,定义两个变量代表下标,其中一个下标代表前k个元素的下标,其中一个下标经过等于val的元素就跳过,不等于就赋值给前k个元素。
如图:
在这里插入图片描述

  1. 开始时L1L2都位于下标0,进入第一次循环,nums[L2]不等于val则赋值给nums[L1]。且L1L2加1,移动至下标1。
  2. 进入第二次循环,nums[L2]等于valL2加1。L1仍位于下标1,L2位于下标2。
  3. 进入第三次循环,nums[L2]不等于valnums[L2]赋值给nums[L1]L1L2加1,L1位于下标2,L2位于下标3。

此时
在这里插入图片描述
以此类推…非val值元素会按顺序逐个向前覆盖,直到L2遍历完数组。

2 合并两个有序数组

leetcode 88.合并两个有序数组
在这里插入图片描述

题目解析

题目大意:合并两个非递减顺序的数组,两数组有效元素个数不同,合并数组也为非递减顺序且其结果存储在nums1数组中,因此nums1Size = m + n, nums2Size = n
代码示例如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{int L1 = m - 1;//nums1数组最后一个有效元素的下标int L2 = n - 1;//nums2数组最后一个有效元素的下标int L3 = m + n - 1;//nums1数组可用的最大下标while (L1 >= 0 && L2 >= 0)//nums1或nums2数组遍历完就结束{//从后往前比较nums1与nums2中有效元素的大小,大的放到nums1[L3],小的继续比if (nums1[L1] < nums2[L2]){nums1[L3--] = nums2[L2--];}else{nums1[L3--] = nums1[L1--];}}while (L2 >= 0)//如果nums2数组中有剩余元素则有序放入nums1中,如果没有则L2<0,不进入循环{nums1[L3--] = nums2[L2--];}
}

需要注意的是nums1数组因为存储合并结果,其容量为m + n,因此其后n个空间是空置的。这里采用的是从后往前比较两数组中的有效元素,较大的从后往前放置在nums1中。
在这里插入图片描述
由于数组为非递减序列的有序数组,因此在同一数组中靠后的元素一定大于等于前一元素,我们只需要比较两个数组的元素,判断出哪个更大即可。
例如:nums1[7] = 11 < nums2[5] = 12,所以将12放到nums1[13]即可。接着继续拿nums1[7] = 11比较nums2[4] = 1011大所以放到nums1[12],以此类推…
最终可能有两种情况,一是nums1先比完所有元素,二是nums2先比完所有元素。如果是情况二,正好完成数组合并且合并结果存储在nums1数组中;如果是情况一,我们需要将nums2数组中剩余元素继续从后往前依次放置到nums1中。
该算法最终时间复杂度为O(m+n),m、n分别取决于nums1与nums2的有效长度。

二、链表相关OJ题

1 移除链表元素

leetcode 203.移除链表元素
在这里插入图片描述

题目解析

题目大意:和顺序表OJ题移除元素类似,但这次换成了链表形式。我们要找出链表中所有数据元素等于val的结点并删除,最后返回新链表的头节点。注意这里的链表是不带头单向不循环链表。

代码示例如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode LTNode;//为了方便重命名简化一下
LTNode* removeElements(LTNode* head, int val)
{LTNode* newhead, *ptail;//newhead为需要返回的新链表的头节点,ptail用于遍历链接新链表newhead = ptail = NULL;LTNode* pcur = head;//pcur用于遍历判断链表结点值while (pcur){if (pcur->val != val)//找到非val值结点,则链接新链表{//链接前先判断新头节点newhead是否为空if (!newhead){//newhead == NULL,赋值ptail = newhead = pcur;}else{//newhead != NULL,更新ptail的next指向ptail->next = pcur;ptail = ptail->next;}}pcur = pcur->next;}if (ptail)ptail->next = NULL;return newhead;
}

虽然链表结点的删除操作相比顺序表简单得多,但这里面仍有许多细节需要注意。这里我们采取的思路是多个指针遍历链表同时记录与判断当前结点是否符合条件。
例如指针pcurptail,后者用于记录新链表的尾结点;前者用于判断当前结点是否符合条件,如果符合条件,我们需要找到新链表当前的尾结点并将符合条件的新结点链接到此尾结点之后。当然这里还需要判断一下新链表是否为空,也就是对newhead判空,如果newhead为空则ptail也一定为空,所以需要对newheadptail进行赋值操作,将pcur找到的第一个符合条件的结点赋值给newheadptail
以此类推找下去,当ptail找到最后一个符合条件的结点时,我们还需要注意链表可能并未结束,因为如果后面存在若干个数据元素等于val的结点,那么pcur虽然会继续遍历跳过,直至为空结束循环,但ptail却不会继续遍历,ptail最后的终点一定是最后一个符合条件的结点,而最后一个符合条件的结点的next指针指向是不确定的,可能为空,也可能还跟着其他结点。所以需要增加一个ptail->next = NULL的语句确保ptail后面没有其他结点,同时为了防止ptail为空,所以增加一个判断语句对ptail判空。

2 反转链表

leetcode 206.反转链表
在这里插入图片描述

题目解析

题目大意:反转逆置任意单向不带头不循环链表,并返回新链表的新头结点,即原链表的尾结点。

代码示例如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode LTNode;
struct ListNode* reverseList(struct ListNode* head)
{if (!head){//链表为空直接返回return head;}LTNode *n1 = NULL, *n2 = head, *n3 = n2->next;//n1,n2,n3分别记录前一结点,当前结点,后一结点while (n2){n2->next = n1;n1 = n2;n2 = n3;if (n3)n3 = n3->next;}return n1;
}

这里采取的思路同样是多个指针,同时记录了当前结点前一结点后一结点三个结点的位置,借此我们就可以遍历链表更改结点指针的指向了。
图示如下:
在这里插入图片描述
需要注意的是每一次循环的衔接与循环的结束条件。首先n2不能为空,其次下一次循环前,需要按照n1->n2->n3的顺序更新位置信息,先n1 = n2,再n2 = n3,接着确保n3不为空的同时n3 = n3->next。最后循环结束的条件是n2为空,当n3为空时n3没有下一个结点,而n2 = n3 = NULL,此时n1成为新链表的头结点,也即原链表的尾结点,而n2n3都为空。

3 链表的中间结点

leetcode 876.链表的中间结点
在这里插入图片描述

题目解析

题目大意:寻找链表的中间结点,若链表结点个数为偶数,则返回最中间的两个结点中的后一个结点,需要注意的是链表结点个数范围为[1, 100],即链表一定不为空。

代码示例如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode LTNode;
struct ListNode* middleNode(struct ListNode* head)
{LTNode* slow, *fast;slow = fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}

示例采用的是快慢指针的思路,在初高中学习的时候我们一定遇见过”追及问题“。当两个人的速度为2倍关系时,两人走过的路程也一定为2倍关系。我们直接将其化为快慢指针法,fast快指针走两步,slow慢指针就走一步,这样它们的路程差为1倍,速度差也为1倍。
图示如下:
在这里插入图片描述
fastfast->next走至空就结束,slow即为所需结点。

4 合并两个有序链表

leetcode 21.合并两个有序链表
在这里插入图片描述

题目解析

题目大意:合并两个升序链表,链表结点的范围是[0, 50],即两链表都可能为空。

代码示例如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2)
{//其中一个链表为空,则直接返回另一个链表头节点即可if (!list1){return list2;}else if (!list2){return list1;}//两链表都不为空ListNode* l1, *l2;//用于遍历链表进行比较l1 = list1;l2 = list2;ListNode* phead, *ptail;//phead为哨兵位记录新链表的头结点,ptail记录新链表的当前尾结点phead = ptail = (ListNode*)malloc(sizeof(ListNode));//申请哨兵位结点phead->next = ptail->next = NULL;while (l1 && l2)//同时遍历两链表{//比较判断l1,l2中结点的值,小的放到新链表尾结点后if (l1->val < l2->val){//l1小,l1结点放到新链表的尾结点后,同时找到l1下一结点ptail->next = l1;ptail = ptail->next;l1 = l1->next;}else{//l2小或相等,l2结点放到新链表的尾结点后,同时找到l2下一结点ptail->next = l2;ptail = ptail->next;l2 = l2->next;}}//两链表长度不一,循环比较完后,可能有一链表还有剩余结点if (l1){//l1剩余结点ptail->next = l1;}if (l2){//l2剩余结点ptail->next = l2;}ListNode* ret = phead->next;//返回值为哨兵位下一结点free(phead);phead = NULL;return ret;
}

与顺序表的合并相同,示例采取的思路是同时遍历两链表,并进行比较判断,哪个小就取哪个结点放到新链表,最后判断一下两链表是否有剩余结点,将剩余结点放到新链表后。

5 链表的回文结构

牛客 OR36 链表的回文结构
在这里插入图片描述

题目解析

题目大意:判断链表是否为回文结构,所谓回文结构类似轴对称,即将一个链表从中间分开,前一段和后一段的逆置是相等的。例如1->2->3->2->1可以从中间分为1221,逆置任意一段则得到另外一段。

代码示例如下:

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head)
{ListNode* slow, * fast;slow = fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}
struct ListNode* reverseList(struct ListNode* head)
{if (!head){return head;}ListNode* n1 = nullptr, * n2 = head, * n3 = n2->next;while (n2){n2->next = n1;n1 = n2;n2 = n3;if (n3)n3 = n3->next;}return n1;
}
bool chkPalindrome(ListNode* A)
{ListNode* midNode = middleNode(A);ListNode* cur = A;midNode = reverseList(midNode);while (cur && midNode){if (cur->val != midNode->val){return false;}cur = cur->next;midNode = midNode->next;}return true;
}

前面已经讲解过链表的中间结点以及链表的逆置等算法,这里可以直接拿来使用。思路大致为先得到中间结点,再逆置后一段链表结点,然后我们就可以分别遍历两段链表进行比较,若都对应相等则返回true,若不等则返回false。
图示如下:
在这里插入图片描述
在这里插入图片描述

6 相交链表

leetcode 160.相交链表
在这里插入图片描述

题目解析

题目大意:两个一定不为空的单链表,请判断它们是否相交,若相交则返回第一个相交结点,若不相交则返回NULL,注意返回时链表保存原始结构。

代码示例如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{//计算两链表各自的长度ListNode *curA = headA, *curB = headB;int lenA = 1, lenB = 1;while (curA->next != NULL){lenA++;curA = curA->next;}while (curB->next != NULL){lenB++;curB = curB->next;}//判断两链表的尾结点是否相交,相交链表的尾结点也一定相交if (curA != curB){return NULL;}int sub = abs(lenA - lenB);//计算两链表长度的差值ListNode *LongList = headA, *ShortList = headB;if (lenA < lenB){LongList = headB;ShortList = headA;}while (sub--)//长链表指针向后走若干步,使两链表处于相同长度的起始位置{LongList = LongList->next;}while (LongList && ShortList)//从相同长度的起始位置开始同时遍历两链表{if (LongList == ShortList)//判断两链表结点的地址是否相同{//链表结点的地址相同,则返回当前结点return LongList;}LongList = LongList->next;ShortList = ShortList->next;}return NULL;//不相交返回空指针
}

示例采取的思路是将两链表变成等长,这样同时遍历两链表时,两个链表上的指针就一定可以同时到达相交结点了,若遍历完链表都没有找到相同的结点地址,则链表一定不相交。

7 环形链表的判断

leetcode 141.环形链表
在这里插入图片描述

题目解析

题目大意:判断链表是否有环,即链表的尾结点的next指针指向的是空,还是某个结点。需要注意链表可以为空。

代码示例如下:

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

这里同样采取快慢指针即可,因为如果存在环就一定存在循环,使用快慢指针且速度差为1倍时,快慢指针一定会相遇。

8 环形链表

leetcode 142.环形链表 II
在这里插入图片描述

题目解析

题目大意:在判断链表是否存在环的基础上,需要我们将链表入环的第一个结点返回。

思路一:
首先我们先来看一段证明,
在这里插入图片描述
L为进环前的长度,X为进环后慢指针走的路程,R为环长。当快慢指针从头节点开始向后走时,慢指针走过L / 2时快指针走过L到达入环结点,当慢指针走过L时快指针在圈内走了L/2,由于环长与进环前的长度没有特定关系,所以不能确定快指针在圈内走过了多少圈。慢指针入环走了x步与快指针相遇在M点,此时一定是慢指针在环内的第一圈,因为慢指针走完一圈,快指针可以走过两圈,所以在第二圈之前两指针一定相遇了,同时由于速度差以及追击问题我们也可以确定快指针在相遇前一定已经走过一次M点,即快指针起码绕环转了一圈。
由相遇的整个过程分析可知,
快指针路程:L + X + nR (n为圈数,n >= 1)
慢指针路程:L + X
由速度关系得出: 2(L + X) = L + X + nR,即L = nR - X
我们得出L = nR - X的关系式要怎么用呢?我们先来变个形式。
变成:L = (n - 1)R + R - X
其中(n - 1)R代表圈数乘以环长,而R - X代表了相遇结点重新走回入环点的距离。这说明我们只要用一个指针从头节点开始走L步,同时让相遇结点处的指针同样走L步,那么相遇结点的指针就会走(n - 1)圈最后走R-X步回到入环点,而这时从头节点开始走的指针也会走到入环点,我们只需要进行一个判断即可得到入环结点。

代码示例如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
ListNode *detectCycle(ListNode *head)
{//先判断是否存在环ListNode* slow = head, *fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;if (slow == fast){//环存在,让一个指针从头结点开始重新走,让一个指针从相遇结点继续在环内走ListNode* meet = slow;while (meet != head){meet = meet->next;head = head->next;}return meet;}}return NULL;
}

思路二:
其实我们可以试着在相遇结点处将环断开,如下
在这里插入图片描述
在这里插入图片描述
先记录下meet->next,用newhead保存,同时将meet->next置为空,这样链表就从meet处断开了,就构成了两个链表,一个从a到b,一个从c到b,我们只需要将两个链表的头结点传给前面相交链表的函数中即可得出第一个相交结点,也即入环点。

代码示例如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{//求相交链表的交点并返回struct ListNode *curA = headA, *curB = headB;int lenA = 1, lenB = 1;while (curA->next != NULL){lenA++;curA = curA->next;}while (curB->next != NULL){lenB++;curB = curB->next;}if (curA != curB){return NULL;}int sub = abs(lenA - lenB);ListNode *LongList = headA, *ShortList = headB;if (lenA < lenB){LongList = headB;ShortList = headA;}while (sub--){LongList = LongList->next;}while (LongList && ShortList){if (LongList == ShortList){return LongList;}LongList = LongList->next;ShortList = ShortList->next;}return NULL;
}
ListNode *detectCycle(ListNode *head)
{ListNode* slow = head, *fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;if (slow == fast){//断环,改为求相交链表问题struct ListNode* meet = slow;struct ListNode* newhead = meet->next;meet->next = NULL;meet = getIntersectionNode(head, newhead);slow->next = newhead;return meet;}}return NULL;
}

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

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

相关文章

OCR 通用端到端模型GOT

摘要 在人工智能领域&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术已经取得了显著的进展。随着技术的不断进步&#xff0c;我们正迈向OCR 2.0时代。本文将介绍由Vary团队开发的通用端到端模型GOT&#xff0c;这一模型在OCR领域具有革命性的潜力。 论文概览 论文…

水滴式多功能粉碎机:粉碎中草药的好帮手

水滴式中草药粉碎机&#xff0c;顾名思义&#xff0c;其设计灵感源自自然界中水滴的柔和与力量。它摒弃了传统粉碎机粗犷的粉碎方式&#xff0c;采用低速研磨技术&#xff0c;模拟水滴穿透岩石的细腻与持久&#xff0c;对中草药进行温和而深入的粉碎。这种技术不仅保留了药材中…

Unreal游戏初始化流程

前言 本文主要是总结Unreal在游戏启动时的初始化流程&#xff0c;包括讨论PIE和Standalone的区别&#xff0c;避免把一些初始化逻辑放在不合适的位置&#xff0c;比如我希望在所有Actor BeginPlay后执行某个逻辑&#xff0c;那我如果把它放在Subsystem的initialize中显然就会搞…

初阶数据结构【TOP】- 11.普通二叉树的介绍 - 1. (细致,保姆~~!)

文章目录 前言一、普通二叉树的链式结构二、 造树三、普通二叉树的遍历四、遍历完整代码五、总结 前言 本篇文章笔者将会对普通二叉树部分进行细致的讲解 , 本篇主要包括以下内容: 二叉树链式结构的介绍 ,二叉树的遍历. 笔者会一步一步分析带学者领略递归的美好~~ 一、普通二叉…

DPO: Direct Preference Optimization 介绍

DPO 是 RLHF 的屌丝版本&#xff0c;RLHF 需要加载 4 个模型&#xff08;2个推理&#xff0c;2个训练&#xff09;&#xff0c;DPO 只需要加载 2 个模型&#xff08;1个推理&#xff0c;一个训练&#xff09;。 RLHF&#xff1a; DPO&#xff1a; DPO 原理 DPO 的本质是监督对…

YoloV10 训练自己的数据集(推理,转化,C#部署)

目录 一、下载 三、开始训练 train.py detect.py export.py 超参数都在这个路径下 四、C#读取yolov10模型进行部署推理 如下程序是用来配置openvino 配置好引用后就可以生成dll了 再创建一个控件&#xff0c;作为显示 net framework 4.8版本的 再nuget工具箱里下载 …

价值流与核心理论框架对比解析:企业业务架构优化的全景指南

企业架构优化中的理论框架选择 随着数字化转型和全球竞争的加剧&#xff0c;企业管理者越来越意识到优化业务流程以提升竞争力的重要性。然而&#xff0c;在众多优化方法中&#xff0c;企业如何选择最适合自己的理论框架成为一大挑战。由The Open Group发布的《价值流指南》系…

密码学基础--ECDSA算法入门

目录 1.ECDSA签名长度的疑惑 2.ECDSA原理 2.1 生成签名 2.2 验签过程 2.3 签名编码问题 3.小结 1.ECDSA签名长度的疑惑 我们来看看ECDSA签名长什么样子&#xff0c;使用MuscleV02自动生成密钥对&#xff0c;并对message"0x11223344”进行签名&#xff0c;结果如下&a…

Java的衍生生态有哪些?恐怖如斯的JAVA

Java的衍生生态极其丰富&#xff0c;涵盖了多个层面和领域。以下是Java衍生生态的一些主要方面&#xff1a; 1. 开源工具 开发工具&#xff1a;如Eclipse&#xff0c;这是一款非常优秀的Java IDE工具&#xff0c;支持Java以及其他语言的代码编写。Spring官方还基于Eclipse开发…

Golang开发之路

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

混合整数规划及其MATLAB实现

目录 引言 混合整数规划的基本模型 混合整数规划的求解方法 MATLAB中的混合整数规划实现 示例&#xff1a;多变量系统的混合整数规划 表格总结&#xff1a;混合整数规划的求解方法与适用场景 结论 引言 混合整数规划&#xff08;Mixed Integer Programming, MIP&#xf…

多线程学习篇二:Thread常见方法

1. 常见方法 方法名 static 功能说明 注意点 start() 启动一个新线程&#xff0c;在新线程里面运行run方法 start 方法只是让线程进入就绪&#xff0c;里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的 start 方法只能调用一次&#xff0c;如果调用了多…

【Hadoop|MapReduce篇】MapReduce概述

1. MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Hadoop集群上。 2. Map…

【绿盟科技盟管家-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

linux 最简单配置免密登录

需求&#xff1a;两台服务器互信登录需要拉起对端服务 ip&#xff1a; 192.168.1.133 192.168.1.137 一、配置主机hosts&#xff0c;IP及主机名&#xff0c;两台都需要 二、192.168.1.137服务器&#xff0c;生成密钥 ssh-keygen -t rsa三、追加到文件 ~/.ssh/authorized_key…

2024年第二届《英语世界》杯全国大学生英语听力大赛

下周开考&#xff01; 一、主办单位 商务印书馆《英语世界》杂志社 二、时间安排 赛事报名时间&#xff1a;即日起-2024年11月15日 正式比赛阶段&#xff1a;第一场&#xff1a;2024年9月22日10:00-22:00 第二场&#xff1a;2024年10月27日10:00-22:00 第三场&#xff1…

QT::QComboBox自定义左击事件信号

因为QComboBox没有自定义的clink信号&#xff0c;所以自己新建一个MyComBox类继承QComboBox&#xff0c;并且添加自定义的左击信号&#xff0c;以及使用该信号连接一个槽函数 mycombobox.h #ifndef MYCOMBOBOX_H #define MYCOMBOBOX_H#include <QComboBox> #include &l…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切(ROI)功能(C语言)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的图像剪切&#xff08;ROI&#xff09;功能&#xff08;C语言&#xff09; Baumer工业相机Baumer工业相机的图像剪切&#xff08;ROI&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff08;ROI&#xff0…

复旦:EoT下Muti-agentllm曾带给我的启发

结合最近的一些经历&#xff0c;回忆起很早之前探索Agent时阅读过的一篇自来复旦/NUS/上海AI Lab的泛CoT框架思想论文&#xff0c;文中提出了一种名为“思想交换”&#xff08;Exchange-of-Thought, EoT&#xff09;的新框架&#xff0c;该框架允许在问题解决过程中进行跨模型交…

android 老项目中用到的jar包不存在,通过离线的方法加载

1、之前的项目用的jar包&#xff0c;已经不在远程仓库中&#xff0c;只能手工去下载&#xff0c;并且安装。 // implementation com.github.nostra13:Android-Universal-Image-Loader // implementation com.github.lecho:hellocharts-android:v1.5.8 这…