算法思想之链表
欢迎拜访:雾里看山-CSDN博客
本篇主题:算法思想之链表
发布时间:2025.4.18
隶属专栏:算法
目录
- 算法介绍
- 常用技巧
- 例题
- 两数相加
- 题目链接
- 题目描述
- 算法思路
- 代码实现
- 两两交换链表中的节点
- 题目链接
- 题目描述
- 算法思路
- 代码实现
- 重排链表
- 题目链接
- 题目描述
- 算法思路
- 代码实现
- 合并 K 个升序链表
- 题目链接
- 题目描述
- 算法思路1
- 代码实现1
- 算法思路2
- 代码实现2
- K 个一组翻转链表
- 题目链接
- 题目描述
- 算法思路
- 代码实现
算法介绍
链表(Linked List
)是一种基于指针或引用的动态数据结构,通过节点间的链接关系实现数据存储。其核心特点是非连续内存分配与高效增删操作,是算法设计中处理动态数据的核心工具之一。
常用技巧
- 画图
画图可以让我们更加直观、形象的理解具体过程。便于我们的理解 - 引入虚拟头结点
便于我们处理边界情况
方便我们对链表进行操作 - 不要吝啬空间,大胆定义变量
在进行链表操作时,多定义几个变量更有利于操作 - 快慢双指针
对于判环、找链表中环的入口、找链表中倒数第n个节点等问题都比较好用
例题
两数相加
题目链接
2. 两数相加
题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字0
之外,这两个数都不会以0
开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]提示:
- 每个链表中的节点数在范围
[1, 100]
内0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
算法思路
两个链表都是逆序存储数字的,即两个链表的个位数、十位数等都已经对应,可以直接相加。
在相加过程中,我们要注意是否产生进位,产生进位时需要将进位和链表数字一同相加。如果产生进位的位置在链表尾部,即答案位数比原链表位数长一位,还需要再 new
一个结点储存最高位。
代码实现
/*** 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* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* cur1 = l1, *cur2 = l2;ListNode* newhead = new ListNode(0);ListNode* cur = newhead;int num = 0;while(cur1 != nullptr || cur2 != nullptr || num!= 0){if(cur1 != nullptr){num+=cur1->val;cur1 = cur1->next;}if(cur2 != nullptr){num+=cur2->val;cur2 = cur2->next;} ListNode* tmp = new ListNode(num%10);num/=10;cur->next = tmp;cur = tmp;}cur = newhead->next;delete newhead;return cur;}
};
两两交换链表中的节点
题目链接
24. 两两交换链表中的节点
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]示例 2:
输入:head = []
输出:[]示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内0 <= Node.val <= 100
算法思路
认真画图,进行模拟即可
代码实现
/*** 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* newhead = new ListNode(0);newhead->next = head;ListNode *prev = newhead, *cur = head, *next = head->next, *nnext = next->next;while(cur!=nullptr && next!=nullptr){prev->next = next;next->next = cur;cur->next = nnext;prev = cur;cur = nnext;if(cur)next = cur->next;if(next)nnext = next->next; }prev = newhead->next;delete newhead;return prev;}
};
重排链表
题目链接
143. 重排链表
题目描述
给定一个单链表
L
的头节点head
,单链表L
表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[1,4,2,3]示例 2:
输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]提示:
- 链表的长度范围为
[1, 5 * 104]
1 <= node.val <= 1000
算法思路
画图画图画图,重要的事情说三遍~
- 找中间节点;
- 中间部分往后的逆序;
- 合并两个链表
代码实现
/*** 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:void reorderList(ListNode* head) {if(head == nullptr || head->next ==nullptr || head->next->next == nullptr) return ;// 1. 找到中间节点ListNode *slow = head,*fast = head;while(fast && fast->next){slow = slow->next;fast=fast->next->next;}// 2. 逆序后半部分ListNode* head2 = new ListNode(0);ListNode *cur = slow->next;slow->next = nullptr;//断开两个链表while(cur){ListNode* next = cur->next;cur->next = head2->next;head2->next=cur;cur = next;}// 3. 合并ListNode *ret = new ListNode(0);ListNode* prev = ret;ListNode *cur1 = head, *cur2 = head2->next;while(cur1){prev->next = cur1;cur1 = cur1->next;prev = prev->next;if(cur2){prev->next = cur2;prev = prev->next;cur2 = cur2->next;} }delete head2;delete ret;}
};
合并 K 个升序链表
题目链接
23. 合并 K 个升序链表
题目描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6示例 2:
输入:lists = []
输出:[]示例 3:
输入:lists = [[]]
输出:[]提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列lists[i].length
的总和不超过10^4
算法思路1
合并两个有序链表是比较简单且做过的,就是用双指针依次比较链表 1
、链表 2
未排序的最小元素,选择更小的那一个加入有序的答案链表中。
合并 K
个升序链表时,我们依旧可以选择 K
个链表中,头结点值最小的那一个。那么如何快速的得到头结点最小的是哪一个呢?用堆这个数据结构就好啦~
我们可以把所有的头结点放进一个小根堆中,这样就能快速的找到每次 K
个链表中,最小的元素是哪个。
代码实现1
/*** 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 {struct cmp{bool operator()(ListNode* l1, ListNode*l2){return l1->val > l2->val;}};
public:ListNode* mergeKLists(vector<ListNode*>& lists) {priority_queue<ListNode*, vector<ListNode*>, cmp> heap;ListNode *newhead = new ListNode(0);ListNode* cur = newhead;for(auto &iter : lists){if(iter)heap.push(iter);}// 合并k个有序链表while(!heap.empty()){ListNode* tmp = heap.top();cur->next = tmp;heap.pop();cur = tmp;if(tmp->next)heap.push(tmp->next);}cur = newhead->next;delete newhead;return cur;}
};
算法思路2
利用递归和链表合并
- 特判,如果题目给出空链表,无需合并,直接返回;
- 返回递归结果。
递归函数设计: - 递归出口:如果当前要合并的链表编号范围左右值相等,无需合并,直接返回当前链表;
- 应⽤二分思想,等额划分左右两段需要合并的链表,使这两段合并后的长度尽可能相等;
- 对左右两段分别递归,合并
[l, r]
范围内的链表; - 再调用
mergeTwoLists
函数进行合并(就是合并两个有序链表)
代码实现2
/*** 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* mergeKLists(vector<ListNode*>& lists) {return mergeSort(lists, 0, lists.size()-1);}ListNode* mergeSort(vector<ListNode*>& lists, int left, int right){if(left>right)return nullptr;if(left == right)return lists[left];// 1. 找中间节点int mid = (left + right) >> 1;// 2.递归排序左右链表ListNode* l1 = mergeSort(lists, left, mid);ListNode* l2 = mergeSort(lists, mid + 1, right);// 3. 合并return mergeTowList(l1, l2);}ListNode* mergeTowList(ListNode* l1, ListNode*l2){if(l1 == nullptr) return l2;if(l2 == nullptr) return l1;ListNode *newhead = new ListNode(0);ListNode* cur = newhead;while(l1 && l2){if(l1->val < l2->val){cur->next = l1;l1 = l1->next;cur = cur->next;}else{cur->next = l2;l2 = l2->next;cur = cur->next;}}if(l1) cur->next = l1;if(l2) cur->next = l2;cur = newhead->next;delete newhead;return cur;}
};
K 个一组翻转链表
题目链接
25. K 个一组翻转链表
题目描述
给你链表的头节点
head
,每k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]示例 2:
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]提示:
- 链表中的节点数目为
n
1 <= k <= n <= 5000
0 <= Node.val <= 1000
进阶:你可以设计一个只用
O(1)
额外内存空间的算法解决此问题吗?
算法思路
本题的目标非常清晰易懂,不涉及复杂的算法,只是实现过程中需要考虑的细节比较多。
我们可以把链表按 K
个为一组进行分组,组内进行反转,并且记录反转后的头尾结点,使其可以和前、后连接起来。思路比较简单,但是实现起来是比较复杂的。
我们可以先求出一共需要逆序多少组(假设逆序 n
组),然后重复 n
次长度为 k
的链表的逆序即可。
代码实现
/*** 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* reverseKGroup(ListNode* head, int k) {if(head == nullptr) return nullptr;// 1. 计算需要翻转多少组int n = 0;ListNode* cur = head;while(cur){n++;cur = cur->next;}n /= k;// 2.完成翻转操作ListNode* newhead = new ListNode(0);ListNode* prev = newhead, *next, *tmp;cur = head;while(n--){tmp = cur;int m = k;while(m--){next = cur->next;cur->next = prev->next;prev->next = cur;cur = next; }prev = tmp;}prev->next = cur;cur = newhead->next;delete newhead;return cur; }
};
⚠️ 写在最后:以上内容是我在学习以后得一些总结和概括,如有错误或者需要补充的地方欢迎各位大佬评论或者私信我交流!!!
相关文章:
算法思想之链表
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之链表 发布时间:2025.4.18 隶属专栏:算法 目录 算法介绍常用技巧 例题两数相加题目链接题目描述算法思路代码实现 两两交换链表中的节点题目链接题目描述算法思路代码实现 重排链表…...
《软件设计师》复习笔记(11.5)——测试原则、阶段、测试用例设计、调试
目录 1. 测试基础概念 2. 测试方法分类 3. 测试阶段 真题示例: 题目1 题目2 题目3 4. 测试策略 5. 测试用例设计 真题示例: 6. 调试与度量 真题示例: 1. 测试基础概念 定义:系统测试是为发现错误而执行程序的过程&…...
工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)
模式定义 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,通过定义抽象工厂接口将对象创建过程延迟到子类实现,实现对象创建与使用的解耦。该模式特别适合需要动态扩展产品类型的场景。 自动驾驶感知场景分析 自动驾…...
Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇
各位Java开发者们好!🚀 2025年的Java世界正在经历一场前所未有的技术变革。作为深耕Java领域多年的技术博主,今天我将带大家深入探索Java生态即将迎来的5大技术趋势,特别是Kotlin的深度融合和AI技术的新篇章。准备好了吗ÿ…...
抗辐照设计优化:商业航天高可靠系统设计的关键路径
随着商业航天领域的快速发展,航天器的可靠性和抗辐照能力已成为系统设计的核心需求。在严苛的太空辐射环境中,电子设备面临着单粒子效应、总剂量效应和位移损伤效应等多重挑战。抗辐照设计优化不仅是确保航天器任务成功的关键路径,更是推动商…...
颚式破碎机的设计
一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备,其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高,设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力:根据目…...
1panel第三方应用商店(本地商店)配置和使用
文章目录 引言资源网站实战操作说明 引言 1Panel 提供了一个应用提交开发环境,开发者可以通过提交应用的方式将自己的应用推送到 1Panel 的应用商店中,供其他用户使用。由此衍生了一种本地应用商店的概念,用户可以自行编写应用配置并上传到自…...
ObjectOutputStream 深度解析
ObjectOutputStream 深度解析 ObjectOutputStream 是 Java IO 体系中的一个关键类,用于序列化(将对象转换为字节流),通常与 ObjectInputStream 配合使用,实现对象的持久化存储或网络传输。 1.作用:完成对象的序列化过程 2.它可以将JVM当中的Java对象序列化到文件中/网…...
如何学习和研究量子计算与量子计算机:从理论到实践的完整路径
量子计算作为量子力学与计算机科学的交叉领域,正在迅速改变我们对计算能力的认知。无论是破解经典加密算法,还是加速药物分子模拟,量子计算都展现出巨大的潜力。然而,学习这一领域需要系统化的理论知识和实践能力。以下是基于最新…...
数据结构学习笔记 :二叉搜索树与高效查找算法详解
目录 二叉搜索树(BST)实现 1.1 顺序存储实现 1.2 链式存储实现查找算法 2.1 顺序查找 2.2 折半查找 2.3 哈希查找总结与应用场景代码示例与完整实现 一、二叉搜索树(BST)实现 1. 顺序存储实现 BST的顺序存储基于完全二叉树的特…...
广搜bfs-P1443 马的遍历
P1443 马的遍历 题目来源-洛谷 题意 要求马到达棋盘上任意一个点最少要走几步 思路 国际棋盘规则是马的走法是-日字形,也称走马日,即x,y一个是走两步,一个是一步 要求最小步数,所以考虑第一次遍历到的点即为最小步数ÿ…...
Ubuntu22.04安装QT、px4安装环境
Ubuntu22.04安装QGC编译环境、QT、px4编译环境 安装QGC安装Ubuntu安装QT配置px4安装环境出现错误怎么办 安装QGC 我使用的是pixhawk V5飞控,在QGC4.4 Guide里,说 安装Ubuntu 直接去清华源里将Ubuntu镜像下载下来(网址:清华源下…...
【IDEA2020】 解决开发时遇到的一些问题
目录 一、批量更新数据库数据 逐条更新 Db.updateEntitiesBatch() 二、Error running,Command line is too long. Shorten command line 报错场景 报错分析 解决方法 一、批量更新数据库数据 逐条更新 List<UserModel> ums userMapper.selectListBy…...
基于autoware1.14的实车部署激光雷达循迹,从建图、定位、录制轨迹巡航点、到实车运行。
1.首先安装autoware ,大家可以以下一下博客进行安装,如果缺少库什么的直接问ai安装对应的库就行。ubuntu18.04安装Autoware1.14---GPU版 最全环境配置说明_autoware1.14安装教程-CSDN博客 安装成功后运行: source install/setup.bash roslau…...
抽象类和接口的区别
1. 定义 抽象类:用于描述一类事物的共性接口:用于描述行为。 2. 方法和变量 抽象类: 可以有普通方法和抽象方法。可以有普通成员变量和静态常量。 接口: JDK 8之前只支持抽象方法,JDK 8后支持默认方法和静态方法…...
自注意力机制self-attention
目录 简介: 输入和输出方式: Sequence Labeling: self-attention运作方式: 一:怎么从vector得到b1 二:利用矩阵的方法怎么得到 Multi-head Self-attention: positional encoding&#x…...
《Operating System Concepts》阅读笔记:p735-p737
《Operating System Concepts》学习第 62 天,p735-p737 总结,总计 3 页。 一、技术总结 1.distributed system (1)定义 A collection of loosely coupled nodes interconnected by a communication network(一组通过通信网络相互连接的松散耦合节点)…...
2025-04-19 Python 强类型编程
文章目录 1 方法标注1.1 参数与返回值1.2 变参类型1.3 函数类型 2 数据类型2.1 内置类型2.2 复杂数据结构2.3 类别选择2.4 泛型 3 标注方式3.1 注释标注3.2 文件标注 4 特殊情形4.1 前置引用4.2 函数标注扩展4.3 协变与逆变4.4 dataclass 5 高级内容5.1 接口5.2 泛型的协变/逆变…...
RVOS的任务调度优化
12.系统优化–任务调度 12.1 改进任务管理功能 在原有基础上进⼀步改进任务管理功能。具体要求:改进 task_create(),提供更多的参数,具体改进后的函数如下所⽰: int task_create(void (*task)(void* param),void *param, uint8…...
【论文阅读20】-CNN-Attention-BiGRU-滑坡预测(2025-03)
这篇论文主要探讨了基于深度学习的滑坡位移预测模型,结合了MT-InSAR(多时相合成孔径雷达干涉测量)观测数据,提出了一种具有可解释性的滑坡位移预测方法。 [1] Zhou C, Ye M, Xia Z, et al. An interpretable attention-based deep…...
图像预处理-图像噪点消除
一.基本介绍 噪声:指图像中的一些干扰因素,也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器:也可以叫做卷积核 - 低通滤波器是模糊,高通滤波器是锐化 - 低通滤波器就…...
PP-OCR的安卓端部署
EMO了几天 我浪费了几天的生命,去研究PP-OCR的模型微调、从训练模型导出预测模型,结果一个坑接着一个坑,没有善终。 找了好多资料,得到一些负面信息,比如说飞浆的团队修复问题不及时啦,代码仓库有好多年不…...
2048小游戏C++板来啦!
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好呀,我是PingdiGuo_guo,今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…...
研0大模型学习(第四、五天)
学习CSDN教程:VSCode Debug指南 但里面貌似主要是针对nodejs的,所以我在 CSDN教程:VSCode调试python程序 中学习,刚开始调试报错python版本太低,于是我安装了旧版本的pythondebugger,再把python解释器从原…...
编程规范之整数运算
在表达式中混用有符号数和无符号数时,可能会因隐式转换而导致非预期的结果。因此应尽量在表达式中使用相同符号类型的 变量。 对于无法使用相同符号类型的场景,应将不同类型的变量显式转换为相同类型,当表达式中的无符号数隐式转换为另一个有…...
【零基础】基于 MATLAB + Gurobi + YALMIP 的优化建模与求解全流程指南
MATLAB Gurobi YALMIP 综合优化教程(进阶) 本教程系统介绍如何在 MATLAB 环境中使用 YALMIP 建模,并通过 Gurobi 求解器高效求解线性、整数及非线性优化问题。适用于工程、运营研究、能源系统等领域的高级优化建模需求。 一、工具概览 1.…...
C++17 信号量模拟实现
C17 信号量模拟实现 一、实现原理 C17 标准库没有原生信号量(C20才有),但可以通过 std::mutex std::condition_variable 模拟实现。以下是核心逻辑: #include <mutex> #include <condition_variable>class CountingSemaphore { private:…...
LINUX学习——守护进程的含义及编程实现
实验目的 理解守护进程的含义。掌握编程实现守护进程的主要步骤。 实验步骤 守护进程的含义: 守护进程是运行在后台的一种特殊进程,独立于控制终端,周期性地执行任务或等待处理事件。守护进程通常以 d 结尾,如 httpd、sshd 等。…...
Json 在线格式化 - 加菲工具
Json 在线格式化 打开网站 加菲工具 选择“Json 在线格式化” 或者直接进入 https://www.orcc.top/tools/json 输入Json,点击左上角的“格式化”按钮 得到格式化后的结果...
final关键字带来的问题
定义了一个配置类: public class EsignConfig { public static final String EsignOrgId "*****"; // 应用ID public static final String EsignAppId "*****"; // 应用密钥 public static final String EsignAppSecret…...
Flash存储器(一):接口标准全解析
目录 一.接口类型与协议标准 二.应用场景 Flash存储器的接口设计直接影响其性能、应用场景及系统集成复杂度。以下从接口类型、协议标准及应用场景三个方面进行系统阐述。 一.接口类型与协议标准 Flash接口类型与协议标准 序号接口类型协议标准特点1并行接口…...
第18周:对于ResNeXt-50算法的思考
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 问题:在上一章代码中是ResNeXt-50的残差单元,问题:如果conv shortcutFalse那么在执行“xAdd0)…“语句时,通道数不一致的&…...
Django 结合 Vue 实现简单管理系统的详解
以下是一个 Django 结合 Vue 实现简单管理系统的详细步骤及示例代码: 项目整体架构思路 后端:使用 Django 搭建 RESTful API,负责数据的存储和处理。前端:使用 Vue 构建用户界面,通过调用后端 API 实现数据的展示、添加、修改和删除等操作。步骤 1:创建 Django 项目和应…...
ValueError: model.embed_tokens.weight doesn‘t have any device set
ValueError: model.embed_tokens.weight doesn’t have any device set model.embed_tokens.weight 通常在深度学习框架(如 PyTorch)中使用,一般是在处理自然语言处理(NLP)任务时,用于指代模型中词嵌入层(Embedding layer)的权重参数。下面详细解释: 词嵌入层的作用 …...
公务员行测之速算分数记忆检验-无答案版本
前言 这一篇是根据百分数,默写分数,我发现我看见百分数有点想不到分数 速算之百分数记忆检验 50 % \ 50\% 50% 33.3 % \ 33.3\% 33.3% 25 % \ 25\% 25% 20 % \ 20\% 20% 16.7 % \ 16.7\% 16.7% 14.3 % \ 14.3\% 14.3% 12.5 % \ 12.5\% 1…...
大模型面经 | DeepSpeed中ZeRO-1、ZeRO-2和ZeRO-3的区别是什么?
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
【Java面试系列】Spring Boot微服务架构下的分布式事务设计与实现详解 - 3-5年Java开发必备知识
【Java面试系列】Spring Boot微服务架构下的分布式事务设计与实现详解 - 3-5年Java开发必备知识 引言 在微服务架构中,分布式事务是一个不可避免的话题。随着业务复杂度的提升,单体应用逐渐演变为多个微服务,如何保证跨服务的数据一致性成为…...
大语言模型减少幻觉的常见方案
什么是大语言模型的幻觉 大语言模型的幻觉(Hallucination)是指模型在生成文本时,输出与输入无关、不符合事实、逻辑错误或完全虚构的内容。这种现象主要源于模型基于概率生成文本的本质,其目标是生成语法合理、上下文连贯的文本&…...
方案解读:虚拟电厂标杆项目整体建设方案【附全文阅读】
在电力市场背景下,传统电力现货市场存在电能定价不合理、分布式电源并网困难等问题。本虚拟电厂标杆项目旨在研究全时间尺度虚拟电厂智能管控关键技术,通过研制虚拟电厂控制器样机、开发运行管理平台,实现对分布式能源的合理优化配置。项目内容涵盖虚拟调控、建设目标、建设…...
shiro使用
shiro是apache提供的一种安全框架。他可以将登录,权限这一方面简单化。 使用shiro需要引入 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.9.0</version></depend…...
Spring Boot日志系统详解:Logback与SLF4J的默认集成
大家好呀!👋 今天我们来聊聊Spring Boot中一个超级重要但又经常被忽视的功能——日志系统! 一、日志系统的重要性 首先,咱们得明白为什么日志这么重要?🤷♂️ 想象一下,你正在玩一个超级复…...
基于SpringBoot成绩管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
AI象棋 3.0 |AI自动下象棋工具,破译残局,自动帮助下棋,内置视频教程
Ai象棋是一款自动识别棋盘并分析下棋局势的工具,它能够自动化操作,帮助用户学习象棋知识。该软件无限制使用、界面无广告简洁,并提供永久授权。数据库中挑选1到2个即可完全满足使用需求,不必全部下载,解压mt管理器即可…...
刘鑫炜履新共工新闻社新媒体研究院院长,赋能媒体融合新征程
2025年4月18日,大湾区经济网战略媒体共工新闻社正式对外宣布一项重要人事任命:聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院第一任院长。这一举措,无疑是对刘鑫炜在新媒体领域卓越专业能力与突出行业贡献的又一次高度认可,也预示着共工…...
学习型组织与系统思考
真正的学习型组织不是只关注个人的学习,而是关注整个系统的学习。—彼得圣吉 在这两年里,越来越多的企业开始询问是否可以将系统思考的内容内化给自己的内训师,进而在公司内部进行教学。我非常理解企业这样做的动机,毕竟内部讲师…...
mysql中优先使用datetime存储时间
基于大模型的问答进行了记录。 对为甚timestamp不如datetime好用做了深入了解,再此记录 范围广 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ 而 timestamp 仅支持’1970-01-01 00:00:01’ 到 ‘2038-01-19 03:14:07’ UTC, 存在2038年问题, 不适合长期存…...
【Linux】深入理解Linux文件系统:从C接口到内核设计哲学
文章目录 前言一、C语言中的文件接口1. 文件指针(句柄)FILE*以写方式打开文件,若文件不存在会新建一个文件W写入方式,在打开文件之前都会将文件内容全部清空追加写方式,其用法与写方法一致,不同在于a方法可…...
前端零基础入门到上班:Day7——表单系统实战全解析
🧩前端零基础入门到上班:Day7——表单系统实战全解析 ✅ 目标:不仅掌握 HTML 表单标签,更深入理解其在实战中的作用、验证方式、美化技巧与 JS 联动,为后续接入 Vue、后端接口打下坚实基础。 🌟 一、HTML 表…...
阀门轴承电动车工件一键精修软件
若需定制开发“ComfyUI意见精修软件” 技术栈建议: 前端:React/Vue Figma插件API(直接读取设计稿)。 后端:Node.js/Python NLP库(spaCy/NLTK)。 数据库:MongoDB(存储…...
【疑难杂症】【VS Code】VS Code连接不上远程服务器
【疑难杂症】【VS Code】VS Code连接不上远程服务器 经过多轮资料查询和测试,这种时候有三种可能: 可能原因1:服务器磁盘空间不足,无法创建服务器连接。 解决方案:清理磁盘空间,尤其是/tmp文件所在的磁盘。…...