- 博客(25)
- 收藏
- 关注
原创 Go 错误处理机制详解:从 error 接口到错误包装与判定
本文系统介绍了Go语言的错误处理机制。文章首先阐述了Go错误处理的核心设计理念——将错误视为普通值而非异常,通过简洁的error接口实现统一抽象。然后详细讲解了错误创建方法(errors.New和fmt.Errorf)、错误包装与解包机制(%w动词和errors.Unwrap)、错误识别工具(errors.Is和errors.As)等核心功能。文中还探讨了自定义错误类型的实现方法,总结了Go错误处理的最佳实践模式,强调及时处理错误、添加上下文、避免重复包装等原则。最后指出Go通过极简的error接口与标准工
2026-06-17 20:58:18
428
原创 Go 泛型核心解析:从类型参数到约束设计
Go 1.18引入泛型是Go语言的重要更新,使开发者能编写更通用的代码而无需牺牲类型安全或性能。泛型通过类型参数(如func MaxT any T)和类型约束(如comparable或自定义接口)实现,支持类型推断减少冗余代码。泛型适用于通用数据结构(集合、缓存等)和算法,避免重复代码和interface{}的类型安全问题。实现上采用部分单态化策略平衡效率和代码膨胀。使用时需注意约束设计、避免过度泛型化,以及方法不能新增类型参数等限制。泛型让Go在保持简洁的同时增强了代码复用能力。
2026-06-14 18:07:44
382
原创 线性筛(欧拉筛):从原理到应用
线性筛是一种O(N)时间复杂度的算法,用于高效筛出1到N之间的所有质数,并能同时预处理最小质因子、欧拉函数、约数个数等数论函数。相比埃氏筛的O(N log log N)复杂度,线性筛通过确保每个合数仅被其最小质因子筛除一次来实现线性复杂度,核心在于当i能被当前质数p整除时立即终止内层循环。该算法不仅能筛质数,还支持多种数论函数的递推计算,如欧拉函数和约数个数,使其成为处理大规模数论问题的有力工具。虽然代码稍复杂,但其强大的扩展性使其在算法竞赛中广泛应用。
2026-06-07 17:47:43
366
原创 算法竞赛数论核心框架:从唯一分解到同余方程
本文系统梳理了算法竞赛中的数论知识框架,围绕两条主线展开:整数结构分析(质因子分解)和模运算规则。第一部分详解算术基本定理、线性筛法及质因数分解的应用;第二部分阐释模运算中的逆元、欧拉定理、扩展欧几里得算法和中国剩余定理等核心工具。文章还分析了组合数取模等交叉应用场景,并介绍了容斥原理、莫比乌斯反演等进阶技巧。最后强调理解原理重于记忆模板,建议通过实践培养数论直觉。全文构建了清晰的竞赛数论知识体系,为算法竞赛者提供了系统化的学习路径。
2026-05-31 16:42:00
324
原创 Go 接口学习笔记:从语法到心法
Go接口采用隐式实现机制,任何类型只要拥有接口声明的全部方法即自动实现该接口,无需显式声明。接口变量由类型信息和数据指针组成,空接口可存储任意值但需类型断言取出。方法接收者类型影响接口实现:指针接收者仅能被指针类型实现。接口nil判断需类型和值均为nil,否则易入陷阱。设计原则建议保持接口小巧、由使用方定义、参数接受接口返回结构体。接口组合可扩展功能,泛型中还可作为类型约束。理解这些特性可有效提升代码解耦和可测试性。
2026-05-24 17:33:59
403
原创 Go 语言切片与数组
本文深入解析Go语言中数组与切片的区别与应用。数组是固定长度的值类型,赋值会完整拷贝,适合小规模固定数据;切片则是动态视图,底层共享数组结构。关键点包括:切片通过指针引用数组,切割操作可能导致数据共享;append可能触发扩容并创建新数组;函数参数传递切片头部结构,修改元素会影响原数据;nil切片与空切片在序列化时有差异。最佳实践建议优先使用切片、预分配容量、注意数据共享问题、正确处理append返回值,并根据需求选择nil或空切片。理解这些底层机制能有效避免性能问题和并发错误。
2026-05-17 16:31:17
354
原创 Go:一门为解决C语言痛点而生的现代语言
Go语言针对C语言的核心痛点进行了系统优化:1)包管理取代头文件,自动处理依赖;2)变量声明类型后置并强制初始化;3)原生多返回值分离错误处理;4)defer机制简化资源清理;5)精简控制结构减少潜在bug;6)保留指针但禁止算术,引入安全切片;7)结构体方法实现数据行为绑定;8)内置工具链提升工程效率。这些改进保留了C的性能优势,通过语言设计和工具自动化解决了C在工程化、内存安全和并发编程上的主要问题,使Go成为更现代化的系统编程语言选择。
2026-05-10 16:11:18
436
原创 深入理解补码:从模运算到硬件实现,告别死记硬背
本文深入浅出地讲解了计算机补码的本质原理。文章指出补码并非人为设计,而是计算机有限字长特性与模运算数学规律共同作用的必然结果。通过分析计算机硬件的两个核心约束(模系统特性和减法通过加法实现),揭示了补码的数学基础是同余定理,即负数可以用模值减去其绝对值的正数来等价表示。文中用4位补码的实例演示了加减运算过程,展示了补码如何通过自动截断实现正确运算。最后对比原码、反码,阐明了补码在硬件实现上的优越性:零表示唯一、符号位参与运算、完美适配加法器设计。全文摒弃复杂公式,从底层逻辑出发,帮助读者真正理解补码&quo
2026-05-05 16:52:33
426
原创 Dijkstra 单源最短路 朴素版 + 堆优化版
本文介绍了两种单源最短路算法:朴素Dijkstra和堆优化Dijkstra。朴素版采用贪心策略,每次暴力查找最近点并更新邻点,时间复杂度O(n²),适合小规模稠密图。堆优化版使用优先队列自动维护最近点,时间复杂度O(mlogn),适合大规模稀疏图。文章提供了两种算法的C++实现代码,并指出Dijkstra算法不能处理负权边,因为其贪心性质会被负边破坏。建议根据图规模选择合适版本:小图用朴素版,大图必须用堆优化版。
2026-04-26 09:19:02
242
原创 数位DP详解
无固定模板,核心是记录“当前数字是否满足题目约束”的中间状态,仅需记录影响后续枚举合法性的信息,避免状态冗余。题目要求“不含数字7”:添加has7状态(布尔类型),记录当前已处理数位中是否出现过7;题目要求“各位数字之和为K”:添加sum状态(整数类型),记录当前已处理数位的数字和;题目要求“是回文数”:添加mask或数组,记录已处理的数位数字,便于后续与未处理数位对比。
2026-04-20 16:28:29
469
原创 最小生成树算法对比:Prim与Kruskal
本文对比了Prim和Kruskal两种最小生成树(MST)算法的核心逻辑与实现。Prim算法采用顶点扩张策略,通过优先队列优化可达O(ElogV)复杂度,适合稠密图;Kruskal算法基于边排序和并查集,复杂度为O(ElogE),更适应稀疏图。两者都满足MST的核心性质:包含所有顶点且边权总和最小。文中提供了完整的C++代码实现,包括Prim的朴素版/堆优化版和Kruskal的并查集版本,帮助开发者根据具体场景(图结构特点)选择最优算法。
2026-04-12 17:48:41
223
原创 差分算法详解
差分算法是高效解决数组区间修改问题的利器。其核心思想是利用差分数组与原数组的互逆关系,将区间修改的时间复杂度从O(n)降至O(1)。一维差分通过d[l]+=val和d[r+1]-=val两步操作实现区间修改,二维差分则通过四个固定步骤完成子矩阵修改。关键要点包括:下标从1开始避免越界、修改后必须通过前缀和还原、时间复杂度优势随操作次数增加而显著。该算法适用于LeetCode等算法竞赛中的区间覆盖、增量优化等题型,是处理高频区间修改场景的最佳选择。
2026-04-06 15:35:30
984
原创 一文读懂Manacher算法:线性时间解决最长回文子串的核心思想
本文介绍了字符串算法中查找最长回文子串的高效解法——Manacher算法。该算法通过两个关键优化将时间复杂度从O(n²)降至O(n):首先通过插入特殊字符预处理字符串,统一处理奇偶长度回文;其次利用回文对称性,通过维护最右回文边界和中心点,复用已计算信息避免重复扩展。算法核心在于"能复用就复用,不能复用再扩展"的思想,通过辅助数组记录回文半径,实现线性时间遍历。文章详细解析了预处理方法、回文半径计算原理以及时间复杂度分析,揭示了这一经典算法的高效本质。
2026-03-29 14:53:35
342
原创 动态规划核心解析:抓本质,破误区
本文深入剖析动态规划(DP)的核心思想与应用要点。DP通过拆分重叠子问题、利用最优子结构,以空间换时间实现高效求解。其三大关键要素是:重叠子问题、最优子结构和状态转移方程。文章强调状态定义是DP的核心基础,直接影响解题成败,并通过爬楼梯和最长递增子序列两个典型案例,展示如何精准定义状态并构建转移方程。最后指出,理解DP的本质在于掌握"问题拆解-子解存储-递推求解"的思维模式,而非简单套用模板。
2026-03-22 15:42:10
372
原创 聊聊回溯算法
摘要: 回溯算法本质是“试错”过程,核心三步:选择、探索、撤销选择。通过递归实现,与普通递归的区别在于“撤销选择”这一步。以全排列为例,回溯通过遍历未选元素、记录路径和标记已选元素来生成所有排列。优化方面,可通过剪枝提前终止无效路径(如组合和超过目标值时)。回溯适用于需要枚举所有可能结果、可分步选择且需回退的问题(如排列、组合、迷宫等)。掌握“试错-回退”思路比死记模板更重要,结合终止条件和剪枝即可灵活应用。
2026-03-15 17:11:22
205
原创 用C++和EasyX写一个学生成绩管理系统——从想法到实现
本文介绍了一个基于EasyX图形库开发的学生成绩管理系统。系统采用C++实现,包含管理员、教师、学生三种角色,具有用户管理、成绩录入、排序分页、数据导出等功能。文章详细记录了开发过程中的关键实现:自定义按钮控件、页面切换机制、双向链表管理学生数据、分页算法设计、冒泡排序节点交换、输入验证方法以及二进制文件读写。特别分享了分页显示和班级平均分计算的具体实现方案,并指出了开发中遇到的典型问题及解决方案。项目采用模块化设计,代码已开源,为类似图形界面系统开发提供了参考。
2026-03-08 17:19:21
390
原创 红黑树:比AVL更“聪明”的平衡树,拆解那些反直觉的核心难点
红黑树与AVL树的本质差异在于平衡代价:AVL追求严格平衡但维护成本高,红黑树通过5条颜色规则实现软平衡,降低旋转频率。红黑树插入仅需处理连续红节点(最多2次旋转),删除则聚焦黑高修复(最多3次旋转)。其设计亮点包括:新节点默认红色减少破坏、哨兵节点简化边界判断、旋转配合改色而非单纯调整高度。这种权衡使红黑树在增删操作上性能更优,成为工业界主流选择。理解红黑树的关键在于把握"用颜色约束替代高度约束"的核心思想,所有复杂操作都是为了以最小代价维持近似平衡。
2025-12-14 13:22:33
819
原创 AVL 树:从递归到迭代,吃透平衡二叉树的插入与删除
本文详细解析了AVL树的核心原理与实现方法。首先通过BST退化为链表的例子说明AVL树的必要性,指出其通过平衡因子和旋转操作保持高效查询性能(O(logn))。文章系统讲解了AVL树的三个核心概念:平衡定义、关键术语和四种旋转操作,并提供了完整的C语言实现代码。 重点对比了递归版和迭代版实现,详细介绍了路径记录和平衡调整的实现方法 文章特别强调旋转操作的本质是让子节点当父节点,这一理解对后续学习红黑树等高级数据结构至关重要。
2025-12-07 18:01:34
1217
原创 二叉树遍历:用 “巷子里捡宝贝” 讲透,走一遍就懂!
本文用 “巷子里捡宝贝” 的通俗类比,拆解二叉树前序、中序、后序、层序四种遍历逻辑:核心是按 “巷口(根)、左岔巷(左子树)、右岔巷(右子树)” 的不同顺序捡宝。递归遍历像组队分工,省心高效;迭代遍历需用栈记 “回头路”,其中后序遍历推荐业界标准的 prev 指针法(无侵入性、省空间),层序则靠队列按层逛。全篇用生活化场景 + 简洁代码,让新手轻松理解遍历本质,快速掌握实操技巧。
2025-11-29 20:07:16
1056
原创 KMP 算法手把手教学(C 语言实现)
对于模式串pattern[0…m-1],前缀函数π[i]表示:子串pattern[0…i]中,最长的相等前缀和后缀的长度;前缀和后缀不能是子串本身(否则长度就是 i+1,没有意义)。索引 i子串 pattern [0…i]可能的相等前后缀最长长度 π[i]0“A”无(只有 1 个字符)01“AB”前缀 “A”、后缀 "B"→不相等02“ABA”前缀 “A”、后缀 "A"→相等;前缀 “AB”、后缀 "BA"→不相等13“ABAB”
2025-11-22 18:50:29
1269
原创 C 语言实现哈希表:基于链地址法的完整实现与深度解析
本文详细讲解整数键哈希表的C语言实现,涵盖哈希函数、冲突处理、自动扩容等核心功能。通过链地址法解决冲突,支持插入、删除、查询等操作。文章从哈希表原理出发,逐步解析数据结构设计、辅助函数实现和核心功能模块,帮助初学者理解哈希表工作机制。代码结构清晰,包含素数判断、内存管理等优化措施,可直接编译运行。特别强调负载因子控制、负数键处理等关键细节,为C语言开发者提供实用的哈希表实现方案。
2025-11-15 19:13:07
1046
原创 链表反转的5种方法
摘要:本文介绍了5种链表反转方法。最优解是双指针迭代法,通过移动两个指针逐步反转节点指向,时间O(n),空间O(1)。头插法通过重建新链表实现反转,复杂度与迭代法相同。递归法将问题分解为处理当前节点与已反转部分的关系,时间O(n),但空间O(n)可能栈溢出,可用尾递归优化。栈方法利用LIFO特性压栈弹出实现反转,时间O(n)但需额外空间。实际开发推荐迭代法和头插法,递归适合理解原理但不推荐生产环境使用。
2025-11-15 15:26:26
639
原创 C 语言实现学生信息管理系统(链表 + 双格式文件存储)
本文介绍了一个基于C语言的学生信息管理系统,采用单链表数据结构实现动态管理。系统支持学生信息的增删改查、表格化打印和文件存储功能,重点解决了以下技术难点:1) 使用fgets和缓冲区清理确保输入安全;2) 完善的输入校验机制;3) 二级指针实现安全的内存管理;4) 支持文本(制表符分隔)和二进制两种存储格式;5) 特殊处理含空格姓名的读取。系统通过结构化设计实现了链表操作、文件I/O、数据校验等核心功能的有机结合,可作为C语言学习的综合实践案例。
2025-11-09 14:09:11
1439
原创 单链表的增删改查
单链表是一种基础数据结构,由包含数据域和指针域的节点组成,支持高效动态操作。本文介绍了单链表的核心操作,包括节点定义、头节点创建以及插入(头插、尾插、指定位置)和删除(按值、按位置)方法。插入操作通过调整指针实现,头插法效率高但逆序排列,尾插法顺序排列但效率较低。删除操作需要定位目标节点及其前驱。此外还包含查询和修改功能,如按位置或值查找节点。单链表在内存非连续分布,适合频繁插入删除场景,但需注意指针管理和内存释放问题。
2025-11-02 18:00:45
497
原创 适合新手快速排序
核心3步:随机选取基准元素,单指针指针分区,递归处理子区间.随机种子只初始化1次。每次分区不能包含已排好的基准元素,否则会导致无限递归。
2025-10-26 18:25:49
282
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅