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

【链表世界的深度探索:从基础到高阶的算法解读】—— LeetCode

文章目录

  • 反转链表
  • 链表的中间结点
  • 合并两个有序链表
  • 相交链表
  • 两数相加
  • 两两交换链表中的节点
  • 重排链表
  • 合并K个升序链表
  • K个一组翻转链表

反转链表

在这里插入图片描述
这道题目的意思很好理解,即将链表给反转即可

  • 方法一:
    利用双指针进行操作,定义两个变量 prev 以及 curr 在遍历链表时,将当前节点curr 的next指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
class Solution 
{
public:ListNode* reverseList(ListNode* head) {// 'prev' 用来跟踪前一个节点,初始化为 nullptrListNode* prev = nullptr;// 'curr' 用来跟踪当前节点,初始化为链表的头节点ListNode* curr = head;// 遍历链表直到到达末尾while (curr) {// 'next' 暂时保存当前节点的下一个节点ListNode* next = curr->next;// 将当前节点的 'next' 指针反转,指向前一个节点curr->next = prev;// 将 'prev' 移动到当前节点,成为下次循环中的前一个节点prev = curr;// 将 'curr' 移动到下一个节点curr = next;}// 循环结束后,'prev' 会指向反转后的链表的新头节点return prev;}
};
  • 方法二:
    利用递归解决,从方法一当中可以知道,我们在while循环里面都是在做一件事情,所以通过递归解决。
class Solution 
{
public:ListNode* reverseList(ListNode* head) {// 如果链表为空或者只有一个节点,直接返回头节点if (!head || !head->next)return head;// 递归调用,反转后续的链表ListNode* newhead = reverseList(head->next);// 将当前节点(head)接到反转链表的后面head->next->next = head;// 断开当前节点(head)的 'next' 指针,避免形成循环head->next = nullptr;// 返回新的头节点return newhead;}
};

链表的中间结点

在这里插入图片描述
不知道大家看到这题的第一个想法是什么?当时我想到的是,在一条马路上,一个人走两步步频,一个人走一步步频,那么当走两步那个人到达终点的时候,走一步的那个人就是在终点了

  • 方法一: 所以这题就可以通过快慢指针进行操作
class Solution 
{
public:ListNode* middleNode(ListNode* head) {// 'slow' 和 'fast' 都初始化为链表的头节点ListNode *slow = head, *fast = head;// 使用快慢指针法,'slow' 每次走一步,'fast' 每次走两步while (fast && fast->next){slow = slow->next;        // 慢指针每次移动一步fast = fast->next->next;  // 快指针每次移动两步}// 当 'fast' 到达链表的末尾时,'slow' 将指向链表的中间节点return slow;}
};
  • 方法二:统计有多少个结点,然后除以二,就是那个结点的位置。
class Solution 
{
public:ListNode* middleNode(ListNode* head) {ListNode* p = head;int count = 0;// 如果链表为空,直接返回 nullptrif (head == nullptr)return nullptr;// 遍历链表,统计节点数while (p) {p = p->next;count++;}// 从头节点重新开始,找到中间节点p = head;for (int i = 0; i < count / 2; i++) {if (p == nullptr)return head;p = p->next;}// 返回中间节点return p;}
};

合并两个有序链表

在这里插入图片描述

  • 方法一:这题也是利用双指针进行解题,创建两个变量l1 l2分别指向两个链表的头,在一个while循环里面判断值的大小,值小的即插入到新创建的一个头结点当中,当l1 && l2有一个为空即停止,然后处理剩余最后的结点即可
class Solution 
{
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {// 如果其中一个链表为空,直接返回另一个链表if (list1 == nullptr)return list2;if (list2 == nullptr)return list1;// 创建一个新的头节点用于合并结果ListNode *newhead = new ListNode();ListNode *newtail = newhead;// 使用两个指针分别遍历两个链表ListNode *l1 = list1;ListNode *l2 = list2;// 合并两个链表while (l1 && l2) {if (l1->val < l2->val) {newtail->next = l1;newtail = newtail->next;l1 = l1->next;} else {newtail->next = l2;newtail = newtail->next;l2 = l2->next;}}// 处理剩余的节点(如果有的话)if (l1) {newtail->next = l1;}if (l2) {newtail->next = l2;}// 返回合并后的链表ListNode* ret = newhead->next;delete newhead; // 释放内存return ret;}
};
  • 方法二:使用递归,来进行函数当中,具有重复性的事情
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/class Solution 
{
public:// 合并两个已排序的链表ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {// 如果第一个链表为空,返回第二个链表if (l1 == nullptr) return l2;// 如果第二个链表为空,返回第一个链表if (l2 == nullptr) return l1;// 比较两个链表的头节点值,递归合并剩余部分if (l1->val <= l2->val){// 如果 l1 的值小于等于 l2,则将 l1 的下一个节点合并到 l2l1->next = mergeTwoLists(l1->next, l2);return l1;  // 返回 l1 作为新的合并后的链表头}else{// 如果 l2 的值小于 l1,则将 l2 的下一个节点合并到 l1l2->next = mergeTwoLists(l1, l2->next);return l2;  // 返回 l2 作为新的合并后的链表头}}
};

相交链表

在这里插入图片描述

  • 解法:简答题,直接两个变量分别遍历两个链表即可
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/class Solution 
{
public:ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {// 如果任何一个链表为空,直接返回 nullptrif (headA == nullptr || headB == nullptr){return nullptr;}// 使用两个指针 pA 和 pB 分别遍历链表 A 和链表 BListNode* pA = headA;ListNode* pB = headB;// 遍历两个链表,直到两个指针指向相同节点或都为 nullptrwhile (pA != pB) {// 如果 pA 到达链表 A 的末尾,重新指向链表 B 的头节点pA = pA == nullptr ? headB : pA->next;// 如果 pB 到达链表 B 的末尾,重新指向链表 A 的头节点pB = pB == nullptr ? headA : pB->next;}// 返回交点节点,如果没有交点,则返回 nullptrreturn pA;}
};

两数相加

在这里插入图片描述
解法:这题思路有点儿像我们小学当中的列竖式,两个链表的头结点即结果的个位,下一个结点即十位,依次下去就是百位,千位,依次推……,所以简单来说这题就是模拟,不过模拟的是链表中的竖式运算。

class Solution 
{
public:// 将两个数字以链表形式相加ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {// 初始化两个链表指针ListNode* cur1 = l1, *cur2 = l2;// 创建一个虚拟头结点,用于方便处理链表的拼接ListNode* newhead = new ListNode();// prev 是尾指针,指向当前链表的末尾节点ListNode* prev = newhead;// 使用 t 来表示进位,初始化为 0int t = 0;// 只要两个链表还有节点或进位不为 0,就继续加法运算while (cur1 || cur2 || t){// 如果 cur1 不为空,将 cur1 的值加到进位 t 中if (cur1){t += cur1->val;cur1 = cur1->next;}// 如果 cur2 不为空,将 cur2 的值加到进位 t 中if (cur2){t += cur2->val;cur2 = cur2->next;}// 将当前位的和(个位)存入新节点prev->next = new ListNode(t % 10);// 更新进位,t // 10 即为进位的值t /= 10;// 移动 prev 指针prev = prev->next;}// 获取链表的实际头结点,跳过虚拟头结点prev = newhead->next;// 释放虚拟头结点的内存delete newhead;// 返回链表的实际头结点return prev;}
};

两两交换链表中的节点

在这里插入图片描述

  • 方法一:
    首先我们知道——给定一个单链表,每两个相邻的节点交换位置,返回交换后的链表。如果链表的长度是奇数,最后一个节点保持不变。交换操作是局部的:仅仅交换每对相邻节点。
    遍历链表时,每次交换一对相邻的节点。为了方便交换,我们可以使用指针 prev 来指向当前交换对的前一个节点。
    使用 cur 来指向当前节点,next 用来指向当前节点的下一个节点,nnext 用来指向下一个节点对的第一个节点,方便下一轮交换。
    我们要不断地更新这些指针,确保交换后的链表依然保持正确的顺序。
class Solution 
{
public:ListNode* swapPairs(ListNode* head) {// 如果链表为空或只有一个节点,则不需要交换if (head == nullptr || head->next == nullptr)return head;// 创建一个虚拟头节点,指向原链表的头节点ListNode* newhead = new ListNode();newhead->next = head;// 创建四个指针:prev(前驱指针)、cur(当前节点指针)、next(当前节点的下一个节点指针)、nnext(next的下一个节点指针)ListNode* prev = newhead, *cur = head, *next = head->next, *nnext = head->next->next;// 开始交换操作:一对一对地交换节点while (cur && next){// 交换 cur 和 next 这两个节点prev->next = next;   // prev 的下一个节点指向 next(即交换后的前一个节点)next->next = cur;    // next 的下一个节点指向 cur(即交换后的后一个节点)cur->next = nnext;   // cur 的下一个节点指向 nnext(即 cur 后面的节点)// 更新指针以继续下一对节点的交换prev = cur;          // prev 指向 cur(新的前驱节点)cur = nnext;         // cur 指向 nnext(新的当前节点)if (cur) next = cur->next; // 如果 cur 不为空,更新 nextif (next) nnext = next->next; // 如果 next 不为空,更新 nnext}// 返回交换后的链表的头节点,跳过虚拟头节点cur = newhead->next;delete newhead;  // 删除虚拟头结点return cur;}
};
  • 方法二:
    递归处理
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/class Solution 
{
public:ListNode* swapPairs(ListNode* head) {// 基本情况:如果链表为空或只有一个节点,直接返回链表本身if (head == nullptr || head->next == nullptr) return head;// 保存交换后的第一个节点(原链表的第二个节点)作为新的头节点ListNode* ret = head->next;// 递归交换后续链表的节点// 交换后续链表的节点,直到链表末尾ListNode* newnode = swapPairs(head->next->next);// 完成当前节点对的交换head->next->next = head;  // 将第二个节点的 next 指向第一个节点,完成交换head->next = newnode;     // 将第一个节点的 next 指向递归返回的新的链表(新的后续部分)// 返回新的头节点return ret;}
};

重排链表

在这里插入图片描述

  • 解法:首先使用快慢指针找到链表的中间节点,将链表分为两部分。然后将后半部分链表反转。接着,将前半部分链表和反转后的后半部分链表交替合并,确保前后部分节点交替排列。最终,返回合并后的链表即可。这个方法利用了快慢指针找到中点,反转后半部分链表,最后通过合并两个链表来完成重排。
class Solution 
{
public:void reorderList(ListNode* head) {// 基本情况:如果链表为空,或者链表长度小于等于 2,则无需操作if (head == nullptr || head->next == nullptr || head->next->next == nullptr)return;// 使用快慢指针找到链表的中间节点ListNode* fast = head, *slow = head;// 快指针一次走两步,慢指针一次走一步,直到快指针到达链表末尾while (fast && fast->next){fast = fast->next->next;slow = slow->next;}// 将 slow 后面的链表进行逆序(头插法)ListNode* newhead = new ListNode(); // 用来存储逆序链表的头节点ListNode* cur = slow->next; // cur 指向链表中间节点的下一个节点(逆序的起始节点)slow->next = nullptr; // 断开链表,慢指针处为链表的中间点while (cur){ListNode* next = cur->next; // 保存下一个节点cur->next = newhead->next;  // 头插法,将当前节点插到新链表的最前面newhead->next = cur;        // 更新新链表的头节点cur = next;                 // 更新当前节点}// 合并两个链表ListNode* ret = new ListNode(); // 用来存储最终的合并结果ListNode* prev = ret; // prev 用来指向合并后的链表的末尾ListNode* cur1 = head, *cur2 = newhead->next; // cur1 是原链表的头节点,cur2 是逆序链表的头节点while (cur1){prev->next = cur1;  // 将 cur1(原链表的节点)接到 prev 后面cur1 = cur1->next;  // 更新 cur1 指向原链表的下一个节点prev = prev->next;  // 更新 prev 指向合并后的链表末尾if (cur2) // 如果逆序链表还有节点{prev->next = cur2; // 将 cur2(逆序链表的节点)接到 prev 后面prev = prev->next;  // 更新 prev 指向合并后的链表末尾cur2 = cur2->next;  // 更新 cur2 指向逆序链表的下一个节点}}// 删除临时创建的链表头节点delete newhead;delete ret;}
};

合并K个升序链表

在这里插入图片描述

  • 解法:该问题可以通过分治法(递归)解决。首先,将 k 个链表两两分组,递归地合并每一对链表。每次合并两个已排序的链表,可以通过比较节点值,将较小的节点依次插入合并后的链表中。递归基准条件为:如果链表数组为空或只剩一个链表,直接返回该链表;否则,将链表数组分为左右两部分,分别递归地合并左右两部分的链表,再合并结果。最终,通过不断合并小部分的链表,得到最终的合并结果。
class Solution 
{
public:// 合并 k 个升序链表ListNode* mergeKLists(vector<ListNode*>& lists) {return merge(lists, 0, lists.size() - 1); // 分治法递归合并链表}// 递归合并左右两个部分的链表ListNode* merge(vector<ListNode*>& lists, int left, int right){// 如果左指针大于右指针,返回空指针(基线条件)if (left > right) return nullptr;// 如果左指针等于右指针,直接返回该链表if (left == right) return lists[left];// 计算中间位置int mid = left + right >> 1; // 递归合并左半部分ListNode* l1 = merge(lists, left, mid);// 递归合并右半部分ListNode* l2 = merge(lists, mid + 1, right);// 合并左右两部分链表return mergeTwoLists(l1, l2);}// 合并两个升序链表ListNode* mergeTwoLists(ListNode* l1, ListNode* l2){// 如果 l1 为空,返回 l2if (l1 == nullptr) return l2;// 如果 l2 为空,返回 l1if (l2 == nullptr) return l1;// 创建一个虚拟头结点,用于简化链表操作ListNode head;ListNode* cur1 = l1, *cur2 = l2, *prev = &head;// 合并两个链表,直到一个链表遍历完while (cur1 && cur2){// 比较 cur1 和 cur2 的值,选择较小的节点添加到合并链表中if (cur1->val <= cur2->val){prev = prev->next = cur1;  // 将 cur1 插入到合并链表cur1 = cur1->next;         // 更新 cur1}else{prev = prev->next = cur2;  // 将 cur2 插入到合并链表cur2 = cur2->next;         // 更新 cur2}}// 如果 cur1 还有剩余节点,直接连接到合并链表if (cur1) prev->next = cur1;// 如果 cur2 还有剩余节点,直接连接到合并链表if (cur2) prev->next = cur2;// 返回合并链表的头节点(跳过虚拟头结点)return head.next;}
};

K个一组翻转链表

在这里插入图片描述

  • 解法:该问题可以通过分组反转链表的方式解决。首先计算链表的总长度,并根据给定的 k 值确定可以反转的完整组数。然后,遍历链表,每次取出 k 个节点进行反转。具体操作是通过将当前节点插入到前一个节点的后面来实现反转。对于每个反转后的组,将其连接到前一组的末尾,最后处理剩余节点(如果不足 k 个节点则不反转)。反转过程通过虚拟头节点简化了头节点的处理,最终返回反转后的链表。
class Solution 
{
public:// 每k个节点反转一次链表ListNode* reverseKGroup(ListNode* head, int k) {// 计算链表中节点的总数int n = 0;ListNode* cur = head;while(cur){cur = cur->next;n++;}// 计算可以进行反转的组数n /= k;// 创建一个虚拟头节点,用于简化链表操作ListNode* newhead = new ListNode();ListNode* prev = newhead;  // prev 用于连接反转后的链表部分cur = head;// 遍历链表并按 k 个节点进行反转for(int i = 0; i < n; i++){// 临时保存当前组的第一个节点ListNode* tmp = cur;// 对当前组的 k 个节点进行反转for(int j = 0; j < k; j++){// 保存当前节点的下一个节点ListNode* next = cur->next;// 将当前节点插入到 prev 之后cur->next = prev->next;prev->next = cur;// 更新 cur 为当前节点的下一个节点cur = next;}// prev 更新为当前组反转后的最后一个节点prev = tmp;}// 处理剩余的部分,如果节点数不足 k,保持原样连接prev->next = cur;// 返回反转后的链表头(跳过虚拟头节点)cur = newhead->next;delete newhead;  // 删除虚拟头节点return cur;}
};

相关文章:

【链表世界的深度探索:从基础到高阶的算法解读】—— LeetCode

文章目录 反转链表链表的中间结点合并两个有序链表相交链表两数相加两两交换链表中的节点重排链表合并K个升序链表K个一组翻转链表 反转链表 这道题目的意思很好理解&#xff0c;即将链表给反转即可 方法一&#xff1a; 利用双指针进行操作&#xff0c;定义两个变量 prev 以及…...

JMeter 性能测试

Jmeter 用户手册 名词解释&#xff1a; RPS&#xff1a;每秒请求数-每秒向服务器发送多少请求数&#xff08;一个场景&#xff0c;系统面临多大的压力&#xff09; TPS&#xff1a;每秒事务数-每秒能够处理多少请求/事务数性能评价标准&#xff08;其中的一个核心指标&#x…...

LCR 159. 库存管理 III

这道题虽然简单&#xff0c;但是可以有多种解法&#xff0c;适合练习各种解法。 可以用基于快速排序思想的快速选择算法&#xff1a; class Solution { public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {vector<int> res;int le…...

Spring IOC(五个类注解)

controller、service、Repository、Component 、Configurationpackage com.java.ioc;import com.java.ioc.Controller.HelloController; import com.java.ioc.rep.UserRepository; import com.java.ioc.service.UserService; import org.springframework.boot.SpringApplicatio…...

JavaScript 中的包装类型:概念、作用与使用场景

文章目录 引言1. 什么是包装类型&#xff1f;1.1 包装类型的定义1.2 包装类型的作用 2. 包装类型的使用2.1 自动装箱&#xff08;Autoboxing&#xff09;示例 2.2 手动创建包装对象示例 3. 包装类型的特性3.1 包装对象的生命周期示例 3.2 基本类型与包装对象的区别示例 4. 包装…...

Linux 如何上传本地文件以及下载文件到本地命令总结

如果你希望在 Shell 终端中将远程服务器上的文件下载到本地电脑&#xff0c;可以使用以下工具和命令&#xff1a; 1. rz / sz&#xff08;用于 Xshell、MobaXterm 等终端&#xff09; 如果你使用的是Xshell、SecureCRT、MobaXterm等支持 rz/sz 的终端&#xff0c;可以使用 rz …...

CentOS 上扩展 Swap 分区的大小

在 CentOS 上扩展 Swap 分区的大小可以通过以下几种方式实现&#xff1a; 方法 1&#xff1a;增加 Swap 文件&#xff08;推荐&#xff09; 如果你的 Swap 是基于文件的&#xff08;而不是分区&#xff09;&#xff0c;你可以增加 Swap 文件的大小&#xff0c;而不需要修改磁盘…...

清晰易懂的Miniconda安装教程

小白也能看懂的 Miniconda 安装教程 Miniconda 是一个轻量级的 Python 环境管理工具&#xff0c;适合初学者快速搭建 Python 开发环境。本教程将手把手教你如何在 Windows 系统上安装 Miniconda&#xff0c;并配置基础环境&#xff0c;确保你能够顺利使用 Python 进行开发。即…...

算法016——最小覆盖子串

力扣——最小覆盖子串&#xff08;点击跳转&#xff09; 分析题目 我们先随便从一个位置开始&#xff0c;让 right 右移&#xff0c;直到找到符合题目的位置停下 之后&#xff0c;让 left 右移&#xff0c;此时会出现两种情况 仍然符合要求&#xff0c;right 不需要动不符合…...

DeepSeek-R1大模型微调技术深度解析:架构、方法与应用全解析

1. DeepSeek-R1大模型架构设计与技术特性 1.1 架构设计 DeepSeek-R1作为超大规模语言模型,其核心架构设计包含以下创新: 专家混合架构(MoE) 采用6710亿参数的混合专家架构(MoE),每个推理过程仅激活370亿参数,实现计算效率与资源利用率的突破性提升。 Transformer框架…...

二阶近似 是什么意思

二阶近似 是什么意思 一、二阶近似的概念与举例 二阶近似是数学分析中通过泰勒展开对函数进行近似的方法,保留到二阶项(即包含一阶导数和二阶导数)。在优化问题(如模型训练)中,常用于近似损失函数,帮助更精准地更新模型参数。 举例: 假设损失函数为 L ( θ ) \mathc…...

STM32U575RIT6单片机(四)

作业: 使用I2C获取SHT20传感器温湿度 使用I2C获取AP3216C三合一传感器: 光照, 接近, 红外 三个功能 合并的传感器 #ifndef SHT20_H #define SHT20_H#include "stdint.h" #include "i2c.h" #include "stdio.h" //1、确定从机的设备地址(代码不…...

deepseek内网离线部署手册

前言 在当下 AI 浪潮汹涌的时代&#xff0c;DeepSeek 以其卓越的性能和出色的表现&#xff0c;迅速成为了众多专业人士和科技爱好者热议的焦点工具。在众多AI大模型的比拼中&#xff0c;DeepSeek 展现出了优越的实力。然而&#xff0c;对于许多企业和组织而言&#xff0c;出于…...

第七次作业,网络防御高级

拓扑&#xff1a;1 接口ip配置和区域划分&#xff1a; fw1&#xff1a; [fw1]interface GigabitEthernet 0/0/0 [fw1-GigabitEthernet0/0/0]service-manage all permit ​ [fw1]firewall zone trust [fw1-zone-trust]add interface GigabitEthernet 1/0/0 ​ ​ [fw1]securi…...

“AIGC”狂飙:一场正在撕裂传统产业链的“智能革命”

前言 在过去的几年中&#xff0c;人工智能技术经历了飞速的发展&#xff0c;深刻地改变了全球科技产业的格局。2023年被称为“AI元年”&#xff0c;这一年的标志性事件包括ChatGPT的发布和大语言模型的快速崛起&#xff0c;这些技术突破不仅引发了全球范围内的关注&#xff0c…...

【鸿蒙开发】Hi3861学习笔记- 定时器中断

00. 目录 文章目录 00. 目录01. 概述02. 定时器相关API2.1 hi_timer_create2.2 hi_timer_start2.3 hi_timer_stop2.4 hi_timer_delete 03. 硬件设计04. 软件设计05. 实验现象06. 附录 01. 概述 定时器&#xff0c;顾名思义就是用来计时的&#xff0c;我们常常会设定计时或闹钟…...

GB9706.1-2020部分定义

一、可拆卸的网电源连接器 1、器具耦合器 2、设备电源输入插口 3、可拆卸电源软电线 4、ME 设备 5、固定的网电源插座/多位插座(MSO) 6、网电源连接器 7、网电源插头 二、可拆卸的网电源连接 1、器具输入插座 2、患者连接 3、电线管 4、可拆卸电源软电线 5、外壳 6、固定…...

PCL 多项式拟合点法线(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这个思路其实很简单,假设我们有一组曲线点,我们可以对其拟合曲线并计算其导数来获取每个点的法向量,当然这一思路也可以扩展至三维。具体过程如下所示: 二、实现代码 PolyFit.h #pragma once/* ** 基于最小二乘…...

docker中安装Ghost报错Error: connect ECONNREFUSED 127.0.0.1:3306

今天尝试在docker中运行ghost报错 "Unknown database error"Error ID:500Error Code: ECONNREFUSED----------------------------------------Error: connect ECONNREFUSED 127.0.0.1:3306at /var/lib/ghost/versions/5.112.0/node_modules/knex-migrator/lib/datab…...

Java创造型模式之原型模式详解

设计模式是面向对象设计中的一种标准方法&#xff0c;用于解决常见的设计问题。原型设计模式&#xff08;Prototype Pattern&#xff09;是23种经典设计模式之一&#xff0c;属于创建型模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而不是通过构造函数或工厂…...

3.17日Man2Marine

上游任务 vs. 下游任务 任务类型作用你的研究中的例子上游任务(Upstream Task)训练通用的音频表示,提供特征在大规模人类语音数据集上进行自监督学习下游任务(Downstream Task)利用上游任务学到的特征进行具体任务微调模型进行海洋哺乳动物叫声分类在 NLP(自然语言处理)…...

Fisher信息、梯度方差与学习率调度器的计算流程

Fisher信息、梯度方差与学习率调度器的计算流程 目录 Fisher信息、梯度方差与学习率调度器的计算流程**步骤1:定义模型与数据集****步骤2:计算梯度与Fisher信息****步骤3:计算梯度方差****步骤4:定义学习率调度器****步骤5:参数更新流程****示例输出****关键概念说明**步骤…...

209、不大于n的数的组合(python)

题目 已知一个数n和可组合的数字集合s&#xff0c;通过组合数字集合构成一个数x&#xff0c;使其不大于n。 例如&#xff1a; n 22356789 a [2, 3, 4, 8, 9] x 22349999 代码实现 n 22356789 a [2, 3, 4, 8, 9] a.sort() s str(n) tag True res [] for i in range…...

Matlab 汽车电子驻车系统仿真分析

1、内容简介 Matlab 176-汽车电子驻车系统仿真分析 可以交流、咨询、答疑 2、内容说明 略 摘 要&#xff1a; 论述了电子驻车制动控制系统的基本结构 、 组成及功能&#xff0c;并基于 Matlab/Simulink &#xff0c;构建了包括直流电机 、 丝杠螺母及其内部 零件和相关摩擦力…...

蓝桥杯备考----模拟算法 phone number

嗯。这道题可以在两个和三个数字加-&#xff0c;我们只要随便输出一个奏行 那么&#xff01;我们规范一下&#xff0c;我们尽可能的只在两个数字之间加&#xff0c;但是如果一共奇数个的话&#xff0c;我们就让最后三个成一组&#xff0c;也就是说&#xff0c;我们用的是个小贪…...

Unity WebGL IIS报错无法使用

Unity WebGL IIS报错无法使用 原因1&#xff1a;WebGL文件夹无访问权限 右键WebGL文件夹-属性 点击安全-编辑-添加 输入ever点击确定-应用即可...

【算法学习之路】11.并查集

并查集 前言一.简介二.基础并查集三.基础并查集题目12 四.种类并查集&#xff08;扩展域并查集&#xff09;五.种类并查集的题目 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也…...

第三课:Python递归编程艺术(从基础到优化)

递归&#xff0c;作为编程中一种优雅而强大的技术&#xff0c;以其简洁的代码风格和强大的问题解决能力&#xff0c;在算法设计中占据着举足轻重的地位。然而&#xff0c;递归的奥秘不仅仅在于其表面的简洁&#xff0c;更在于其背后的逻辑深度与优化技巧。本文将深入探讨递归编…...

插入排序程序并行化

一 插入排序 插入排序是稳定的原地排序算法,核心思想是逐步构建有序序列。对于未排序部分的每个元素,在已排序序列中从后向前扫描,找到合适位置插入。 二 并行化思路 1 分块排序 将数组分成多个子块,每个线程使用插入排序处理一块。 2 归并合并 将各有序子块归并成最终数…...

【系统架构设计师】操作系统 - 文件管理 ③ ( 树形目录结构 | 文件属性 | 绝对路径 与 相对路径 )

文章目录 一、树形目录结构1、树形目录结构 概念简介2、树形目录结构 组成3、文件属性4、树形目录结构 示例 二、绝对路径 与 相对路径1、绝对路径2、相对路径3、绝对路径 与 相对路径 对比 一、树形目录结构 1、树形目录结构 概念简介 " 树形目录结构 “ 又称为 ” 多级目…...

【量化科普】Standard Deviation,标准差

【量化科普】Standard Deviation&#xff0c;标准差 &#x1f680;量化软件开通 &#x1f680;量化实战教程 在量化投资领域&#xff0c;标准差&#xff08;Standard Deviation&#xff09;是一个非常重要的统计指标&#xff0c;用于衡量一组数据的离散程度。简单来说&#…...

实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)

一、实验目的 Python 数据可视化&#xff1a; 1、学习使用 jieba、wordcloud 等类库生成词云图。 2、学习使用 Matplotlib 库进行数据可视化。 Python 聚类-K-means&#xff1a; 1、理解聚类非监督学习方法的基本原理。 2、掌握 Python、numpy、pandas、sklearn 实现聚类…...

东方通TongHttpServer:企业级服务代理中间件的卓越之选

随着信息技术的飞速发展&#xff0c;企业对于高性能、高安全性的中间件需求日益增长。东方通作为中国中间件领域的领军企业&#xff0c;凭借其在“安全”、“数据”和“智慧”三大产品体系上的深厚积累&#xff0c;推出了TongHttpServer&#xff08;简称THS&#xff09;&#x…...

EB-Cable许可证的常见问题及解决方案

在使用EB-Cable软件时&#xff0c;许可证问题可能是用户经常遇到的挑战之一。为了帮助用户更好地理解和解决许可证相关的问题&#xff0c;本文将列举一些常见的EB-Cable许可证问题&#xff0c;并提供相应的解决方案。 常见问题一&#xff1a;许可证激活失败 问题描述&#xff…...

ZED X系列双目3D相机的耐用性与创新设计解析

在工业自动化和学术研究领域&#xff0c;高精度的视觉设备正成为提升效率和质量的关键。ZED X系列AI立体相机&#xff0c;凭借其先进的技术和耐用的设计&#xff0c;为这一领域带来了新的可能。 核心技术&#xff1a;深度感知与精准追踪 ZED X系列的核心技术之一是Neural Dept…...

深入解析Java面向对象三大特征之多态、final、抽象类与接口

面向对象编程&#xff08;OOP&#xff09;的三大核心特征为封装、继承、多态&#xff0c;其中多态是最具灵活性和扩展性的特性。本文将从多态的本质出发&#xff0c;结合final关键字、抽象类与接口的设计&#xff0c;深入探讨这些概念的应用场景及其在代码中的实现细节&#xf…...

jmeter 循环控制器遍历列表中的数据

jmeter遍历列表中的数据并使用if控制器做相应的处理 测试场景请求获取列表接口发送请求JSON Extractor 提取对应字段 Loop Controller计数器If Controller 测试场景 请求获取列表接口使用循环控制器遍历接口&#xff0c;根据state字段判断是否发起其他请求 请求获取列表接口 …...

【Linux内核系列】:进程板块与文件板块的综合

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生中成功只是一时的&#xff0c;失败却是人生的主旋律&#xff0c;但是如何面对失败却把人分成了不同的样子&#xff0c;有的人会被…...

深入理解嵌入式开发中的三个重要工具:零长度数组、container_of 和 typeof

在嵌入式开发中,内核开发者经常需要处理复杂的数据结构和动态内存分配。零长度数组、container_of 宏和 typeof 是内核开发中三个非常重要的工具,它们在结构体管理、内存操作和类型处理中发挥着关键作用。本文将详细探讨这三个工具的功能、应用场景及其在内核开发中的重要性。…...

第27周JavaSpringboot git初识

Git 课程笔记 一、Git 的介绍 1. Git 的诞生背景 Git 是 Linux 内核的作者 Linus Torvalds 为了更好地管理 Linux 内核开发而创建的版本控制系统。在 Linux 内核开发初期&#xff0c;由于开发者众多&#xff0c;协作成本很高&#xff0c;后来使用了 BitKeeper 工具来辅助协作…...

实战2. 利用Pytorch解决 CIFAR 数据集中的图像分类为 10 类的问题——提高精度

实战2. 利用Pytorch解决 CIFAR 数据集中的图像分类为 10 类的问题——提高精度 前期准备加载数据建立模型模型训练质量指标 让我们回到图像分类问题 CIFAR。 你的主要任务&#xff1a;实现整个模型训练流程&#xff0c;并在测试样本上获得良好的准确度指标值。 任务积分&#…...

CentOS高性能数据处理优化指南

在CentOS系统中&#xff0c;为实现高性能数据处理&#xff0c;需要从多个层面进行优化&#xff0c;包括系统配置、内核参数、硬件资源管理及软件优化等。 一、硬件优化 选择合适硬件是优化性能的基础&#xff0c;大规模数据处理任务建议使用多核CPU、大容量内存、SSD存储以及…...

深度剖析:Pytest Fixtures如何重塑自动化测试的可读性与高效性

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 在编写单元测试时&#xff0c;是否发现自己写了很多相同/相似代码呢&#xff1f; 像…...

AIP-181 稳定级别

编号181原文链接AIP-181: Stability levels状态批准创建日期2019-02-18更新日期2019-02-18 虽然不同组织&#xff08;谷歌或其他组织&#xff09;拥有不同的产品生命周期&#xff0c;AIP使用以下术语指代API组件 稳定性 。 注意 这些稳定级别大致对应于Google Cloud中的产品发…...

比较 (leetcode 452. 用最少数量的箭引爆气球 leetcode 435. 无重叠区间 leetcode 56. 合并区间

leetcode系列 文章目录 一、射箭引爆气球二、无重叠区间三、合并区间总结 提示&#xff1a;小白个人理解&#xff0c;如有错误敬请谅解&#xff01; 对于此类题目&#xff0c;都先按左区间排序&#xff0c;之后根据重叠还是不重叠来进行操作 一、射箭引爆气球 找到最大的重叠…...

什么是有限元力学?分而治之,将复杂问题转化为可计算的数学模型

有限元力学是应用有限元方法&#xff08;Finite Element Method, FEM&#xff09;解决力学问题的学科&#xff0c;属于计算力学的重要分支。它通过将复杂的连续体结构离散化为有限个简单单元的组合&#xff0c;结合数学和物理原理&#xff0c;近似求解力学行为&#xff08;如应…...

python项目一键加密,极度简洁

在要加密的项目内运行python -m pip install py2safe 安装后cd到项目的根目录,运行py2safe 它会递归加密所有文件夹,不需要参数,拿过来就用,基于pyarmor开发,基本破解不了,太方便辣 这是readme文件,不仅提到了用法,还贴心的加入了口腔溃疡的治疗办法,真是太贴心了 # py2saf…...

STM32 ADC原理与驱动详解:从存储器映射到多通道采集(下) | 零基础入门STM32第六十六步

主题内容教学目的/扩展视频ADC读电位器和光敏重点课程电路原理&#xff0c;跳线设置&#xff0c;ADC功能分析&#xff0c;驱动程序&#xff0c;读出AD数据&#xff0c;读内部温度传感器数据。会设置参数&#xff0c;能读出AD值即可。 师从洋桃电子&#xff0c;杜洋老师 本文深入…...

JxBrowser 8.5.0 版本发布啦!

• 为 Compose Desktop 提供了硬件加速渲染支持 • 支持自定义 Chromium 二进制文件的品牌标识 • 多项质量改进 了解更多 获取 30 天免费试用...

LIN接口

LIN接口 前言LIN接口简介帧格式同步间隔段 (Break Field)同步段 (Sync Byte Field)受保护ID段 (Protected Identifier Field)数据段 (Data Field)校验和段 (Checksum Field) 帧在总线上的传输波形帧类型无条件帧事件触发帧偶发帧诊断帧保留帧 错误类型 IP 设计结构框图接口设计…...