- 博客(33)
- 收藏
- 关注
原创 BACI编译器执行指南:从配置到运行,以及遇到的问题
BACI(Ben-Ari Concurrent Interpreter)是一个专门为操作系统和并发编程教学设计的实验环境。在操作系统课程中,我们经常需要编写并发程序来理解进程同步、互斥、死锁等概念。BACI提供了一个Pascal-like的编程语言,让我们能够编写并发程序,并通过其编译器和解释器观察程序的执行行为。编码问题的重要性:在全球化开发中,字符编码是需要特别注意的问题系统底层知识:理解卷标、路径、盘符的区别,有助于更深入地理解文件系统问题解决能力:从现象到原因,从原因到解决方案的系统性思考方法。
2026-05-07 12:59:56
312
原创 深度优先搜索(DFS)与回溯算法详解:以全排列问题为例
本文介绍了使用深度优先搜索(DFS)生成1~n全排列的算法。通过递归实现DFS遍历所有可能的排列组合,利用mark数组标记已使用的数字避免重复,在递归到最深层时输出完整排列。关键点包括:递归参数u控制深度、循环枚举选择、回溯时恢复状态(mark[i]=false)、按字典序输出排列(循环从1到n)。以n=3为例详细演示了递归调用栈的变化过程,展示了如何通过回溯机制生成所有6种排列。该算法时间复杂度为O(n!),是解决排列组合问题的经典方法。
2026-04-10 22:33:26
363
原创 算法题解:二分查找解决巧克力分块问题
本文探讨如何将N块不同尺寸的巧克力分割成K个相同大小的正方形。核心思路是利用二分查找确定最大可能的正方形边长,通过验证函数计算当前边长下能切出的正方形总数。算法时间复杂度为O(NlogR),其中R是最大边长,能够高效解决问题。关键点在于:1) 边长与可切数量呈单调关系;2) 整数除法自动处理边角料;3) 二分查找框架的应用。该方法将最优化问题转化为判定问题,具有通用性,可扩展至类似场景。
2026-04-10 18:10:38
345
原创 从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
本文详细记录了一道任务调度问题的解题过程。从暴力搜索(DFS)开始,发现其复杂度不可行;转而尝试按b_i排序的贪心算法,虽能处理大规模数据但存在反例;最终通过数学推导,发现按a_i+b_i排序并结合反悔机制的最优解法。文章深入分析了每种算法的设计思路、实现细节、复杂度及适用场景,特别强调了数学洞察在算法突破中的关键作用。通过对比三种算法,展示了从基础解法到最优方案的完整优化路径,为算法学习者提供了宝贵的解题思路和方法论指导。
2026-04-09 19:53:37
408
原创 彻底掌握C++ sort函数:自定义排序规则详解(全普通函数版)
本文深入讲解C++中sort函数自定义比较函数的用法。核心要点包括:1)比较函数返回true表示第一个参数应排在前面;2)通过a<b实现升序,a>b实现降序;3)多级排序需先判断主要条件;4)必须满足严格弱序规则;5)注意防止整数溢出。文章通过pair排序、结构体排序、字符串特殊排序等丰富示例,展示了如何应对各种排序需求,并提供了性能优化和调试技巧。掌握这些技巧能有效提升算法竞赛和实际开发中的排序处理能力。
2026-04-09 13:58:34
423
原创 删除k位数字得到最大数 - 单调栈解法详解
摘要:本文探讨了如何从N位数字中删除k位后得到最大数的问题。初始错误思路(删除最小数字)被证明存在缺陷,无法保证高位数字最大化。正确的解法采用单调栈贪心算法:从左到右遍历数字,维护单调递减栈,当遇到更大数字时弹出栈顶较小数字(若仍有删除次数)。算法时间复杂度O(n),空间复杂度O(n)。通过数学归纳法证明了算法的正确性,并指出该思路可拓展至类似问题。核心教训在于贪心算法设计需深入理解问题本质,局部最优选择应服务于全局最优解。
2026-04-09 01:01:26
353
原创 斐波那契取模问题的深入分析:为什么提前取模是关键的
本文探讨了蓝桥杯算法赛中关于斐波那契数列取模问题的三种解法差异。关键在于取模操作的时机:正确解法在计算过程中立即取模,避免了整数溢出;而错误解法由于延迟取模导致斐波那契数快速超过数据类型范围。文章详细分析了整数溢出的原因、取模运算的数学原理,并指出斐波那契数列对m取模具有周期性(Pisano周期)。最终结论是:在计算涉及大数的模运算时,应尽早取模以保证数值范围安全,同时可利用周期性优化算法效率。
2026-04-08 23:23:32
352
原创 【算法详解】飞机降落问题:DFS剪枝解决调度问题
本文探讨了单跑道机场飞机降落调度问题。给定N架飞机,每架有到达时间Tᵢ、盘旋时间Dᵢ和降落时间Lᵢ,要求判断是否存在降落顺序使所有飞机都能在[Tᵢ,Tᵢ+Dᵢ]时间窗内完成降落。该问题可转化为单机调度问题,采用深度优先搜索(DFS)枚举所有可能的降落顺序,通过剪枝优化搜索效率。算法核心在于:为每架飞机检查时间窗约束(开始时间=max(上一架完成时间,Tᵢ)≤Tᵢ+Dᵢ),时间复杂度为O(N!×N)。文章分析了算法正确性、剪枝策略,并通过示例验证解法有效性,指出该DFS方法适用于小规模问题(N≤10),是简洁
2026-04-08 12:24:35
409
原创 深入解析蓝桥杯省赛题:X进制减法的最优策略
本文探讨了蓝桥杯省赛中的X进制减法问题,提出了一种基于贪心策略的优化解法。问题要求在满足每位进制≥2且不超过给定最大值N的条件下,通过合理选择进制使A-B的十进制结果最小。核心思路是从低位到高位为每位选择允许的最小进制(max(2, max(aᵢ,bᵢ)+1)且≤N),以此限制高位权重增长。算法采用逆序存储、逐位计算的方式,时间复杂度O(max(Ma,Mb))。通过数学证明和示例分析验证了该策略的正确性,并讨论了边界条件处理。这种贪心方法展示了如何通过局部最优选择达到全局最优解,为解决类似优化问题提供了思路
2026-04-05 00:36:46
388
原创 从“分组游戏”到数学结构:等价关系、等价类、商集与划分完全指南
本文系统阐述了数学中的等价关系理论及其应用。首先介绍了等价关系的三个基本公理(自反性、对称性、传递性)及其生活实例(如学生分组、整数模运算)。其次详细讲解了等价类、商集和划分的概念,通过具体例子展示了它们之间的内在联系。文章揭示了等价关系与划分的一一对应关系,并分析了两个极端案例(恒等关系和全域关系)。最后探讨了该理论在数学、计算机科学及认知领域的重要应用价值,指出这套分类工具不仅具有数学美感,更是理解世界结构的重要方法。全文将日常分类直觉提升为精确的数学语言,展现了数学抽象思维的强大力量。
2026-03-24 20:46:31
388
原创 动态规划解最长不下降子序列:深入理解状态转移与内层循环
本文详细介绍了最长不下降子序列(LNDS)问题的动态规划解法。首先解释了使用动态规划的原因:问题具有最优子结构和重叠子问题特征。然后详细阐述了状态定义(dp[i]表示以第i个元素结尾的最长序列长度)和状态转移方程(需比较所有前驱元素),并强调必须比较所有前驱元素才能保证正确性。接着给出了基础版(O(n²))和优化版(O(nlogn))的代码实现,其中优化版本通过维护单调数组和二分查找提高效率。最后总结指出,该问题很好地展示了动态规划的核心思想,即通过解决相互关联的子问题来构建原问题的解。
2026-03-23 00:51:29
423
原创 最大子数组和算法全解析:从暴力枚举到动态规划优化
本文系统探讨了最大子数组和问题的多种解法。从暴力解法(O(n³))到优化暴力解法(O(n²)),最终提出最优的动态规划解法Kadane算法(O(n))。文章详细分析了Kadane算法的状态转移方程和贪心选择性质,并提供了C++实现代码。进一步扩展讨论了环形数组、二维矩阵、多解情况和乘积问题等变种,展示了如何将基础算法思想应用于更复杂场景。通过时间复杂度对比和实际应用场景分析,论证了Kadane算法的高效性和实用性,为算法学习者提供了从基础到进阶的完整学习路径。
2026-03-20 13:35:47
406
原创 蓝桥杯“水质检测“问题:0-1 BFS算法的完整解析
本文探讨了蓝桥杯"水质检测"问题的优化解法。该问题要求在2行n列的网格中用最少的检测器连接所有已有检测器。通过将问题转化为边权为0或1的无向图,提出使用0-1BFS算法,该算法结合了贪心策略和双端队列技术,时间复杂度优化至O(n)。详细解析了算法设计思路、正确性证明及实现细节,并提供了完整代码。0-1BFS巧妙融合了贪心、BFS和Dijkstra的优点,在保证结果正确的同时实现了高效计算,为解决类似连通性问题提供了范例。
2026-03-15 15:05:47
489
原创 破除C语言两大“天书代码”:从困惑到通透的完全指南
C语言晦涩语法背后的设计哲学:解析两个经典"天书代码"。第一段((void()())0)()展示了直接调用内存地址0函数的技术,通过强制类型转换和解引用实现硬件级操作。第二段void(signal(int,void()(int)))(int)是UNIX信号处理函数的复杂声明,体现了C语言回调机制的核心。文章详细拆解了这两种语法的解析方法,建议使用typedef提升代码可读性,并指出这些晦涩语法反映了C语言作为系统编程语言直接操作硬件的本质能力。理解这些代码是从新手成长为系统编程专家的必经
2026-02-13 15:21:23
637
原创 C语言数组参数传递详解:一维数组、指针数组、二维数组
本文详细讲解了C语言中数组作为函数参数的传递规则。一维数组退化为元素指针,可用int arr[]、int arr[10]或intarr三种等价形式;指针数组退化为二级指针,可用intarr[]或int**形式;二维数组必须指定列数,可用int arr[][N]或数组指针形式。文章通过实例分析了常见错误原因,强调理解数组内存布局和"退化"机制的重要性,并提供了实用的记忆口诀和编程建议,帮助读者掌握这一关键知识点。
2026-02-12 12:06:55
534
原创 深度解析C语言数组名、数组地址和首元素地址的核心区别
C语言中arr、&arr、&arr[0]三者区别在于类型而非地址值。虽然它们都指向数组起始位置,但类型不同:arr作为数组名会退化为指向首元素的指针(int*),&arr[0]明确获取首元素地址(int*),而&arr则是获取整个数组地址(int(*)[n])。关键区别体现在指针运算和sizeof行为上:arr+1和&arr[0]+1移动一个元素大小,而&arr+1移动整个数组大小;sizeof(arr)返回数组总字节数,而其他两个返回指针大小。
2026-02-10 20:48:53
553
原创 Dijkstra算法:从源头到每一个顶点的最短路径探寻
为什么能确定每一步选出的顶点的距离是最短的?因为它是当前未确定顶点中距离最小的,任何其他路径必须先经过某个未确定顶点,而这些顶点的距离都不小于它。为什么不需要比较所有路径?算法通过数学性质剪枝,只关注可能改进的路径,避免了大量无效比较。会不会遗漏更短路径?不会。任何更短路径上的中间顶点都会先被处理,从而更新目标顶点的距离。为什么要求权重非负?如果权重可为负,则可能存在绕远路但总权重更小的路径,破坏贪心选择性质。
2026-01-21 16:06:37
640
原创 网络连接的三块基石:DHCP、ARP、DNS如何让您一键上网
DHCP是自动配置工,设备接入网络时,它提供所有必要参数ARP是地址翻译官,在IP地址和MAC地址间架起桥梁DNS是电话查询台,将人类友好的域名转换为机器IP它们的协同工作,对您完全透明。您只需要连接网络,剩下的交给协议。最后的重要建议普通用户保持"自动获取IP地址",不要手动配置需要固定IP时,在路由器设置IP-MAC绑定选择DNS时考虑实际需求,国内网站多用国内DNS理解这些协议,能帮您更好排查网络问题将复杂留给系统,将简单留给用户。这些协议默默工作,让您享受一键上网的便利。
2025-12-07 00:48:57
955
原创 网络通信的基石:彻底理解二层与三层,掌握VLAN和IP子网
本文深入解析了VLAN与IP子网必须匹配的原因。VLAN在数据链路层隔离广播域,而IP子网在网络层实现逻辑寻址。同网段不同VLAN会导致通信死锁,因为二层广播被VLAN阻断;仅用IP子网则无法隔离广播流量,存在安全隐患。二者协同工作:VLAN提供硬件级隔离,IP子网实现可控的跨VLAN路由。文章通过完整的数据包传输过程,展示了三层设备如何重写帧头实现跨VLAN通信,并强调IP地址保持不变而MAC地址和VLAN标签逐跳变化的原理。这种分层设计既确保了网络性能和安全,又提供了灵活的通信路径。
2025-12-02 23:33:32
832
原创 顺序表完全指南:从原理到实战的深度解析
本文系统讲解了顺序表的实现原理与核心操作,重点分析了位序与下标的转换关系(下标=位序-1)。详细阐述了插入、删除、查找等操作的边界条件:插入位序范围1~length+1,删除范围1~length。通过代码示例展示了顺序表的初始化、增删查改等操作实现,并总结了顺序表随机存取O(1)但插入删除O(n)的特性。文章最后给出了记忆口诀和调试技巧,强调先检查后操作的安全原则,帮助读者全面掌握这一基础数据结构。
2025-11-29 23:14:13
1125
原创 二叉树节点统计:递归策略的深度解析
本文对比了二叉树中叶子节点和度为2节点的递归统计方法,揭示了关键差异。叶子节点统计可直接返回1并终止递归,而度为2节点统计必须继续递归其子树。正确实现度为2节点计数需要:1)判断当前节点是否满足条件;2)无论当前节点状态如何都递归左右子树;3)累加当前计数和子树结果。根本区别在于叶子节点是递归终点,而度为2节点需要继续探索。文章强调递归完整性比简洁性更重要,并提供了通用递归模式,建议通过具体示例验证代码正确性。
2025-11-29 21:50:32
636
原创 一个printf引发的思考:-1为何变成255?揭秘C语言的整型提升与符号截断
学习C语言,就像学习一门内功心法,不仅要记住招式(语法),更要理解内力运行的原理(底层机制)。因此,为了代码的可移植性和清晰性,当我们明确需要符号时,应使用。是字符类型,顾名思义,它最初是用来存储字符(如‘A’,‘1’,‘!现在,让我们看看当数据在不同大小的“容器”间传递时,会发生什么。(signed char):符号扩展,提升为32位的-1。(signed):符号扩展,提升为32位的-1。,那么恭喜你,你的直觉是符合人类思维的。的高24位,只保留最低的8位,然后放进。这个32位的补码,代表的整数依然是。
2025-11-15 12:26:57
735
1
原创 插入排序(C语言实现):从单元素插入到完整排序的逻辑拆解
本文详细讲解了插入排序算法的工作原理和实现方法。插入排序通过将数组分为已排序和未排序两部分,每次从未排序部分取出元素插入到已排序部分的正确位置,最终完成排序。文章首先以单元素插入为例,展示如何将新元素插入已排序数组;然后扩展到完整排序过程,通过C语言代码详细解析了算法实现。插入排序时间复杂度为O(n²)(最坏情况),空间复杂度O(1),具有稳定性和原地排序特性,适合小规模或近似有序数据。文章通过扑克牌排序的类比和逐步代码解析,帮助读者深入理解这一基础排序算法。
2025-08-08 23:15:27
1371
原创 选择排序——C语言
在选择排序中max初始的时候是假设一个值,但是我们假设的这个max值应该存在未排序区中也就是在循环内部直接写int max=i; -----------豪哥2025.8.2 台风天。
2025-08-02 17:55:22
1183
原创 斐波那契数列的表示——C语言
宏定义N:使用#define定义常量N=20,表示需要计算和输出20项优点:需要修改项数时只需改这一处数组声明:创建长度为N的long类型数组fib使用long类型防止大数溢出(虽然前20项不会溢出)初始化{1, 1}显式设置前两项剩余元素自动初始化为0(但后续会被覆盖)
2025-06-28 16:31:35
1457
原创 用指针数组实现字符串排序
指针数组是C语言中存储指针的数组,每个元素都是内存地址。常见错误包括:1)未初始化指针导致未定义行为;2)错误交换指针而非字符串内容;3)所有指针指向同一内存导致数据覆盖。正确使用需要:1)明确定义数据类型*数组名[长度];2)注意与数组指针(char(*ptr)[N])的区别;3)排序时应交换指针地址而非内容。典型应用场景包括字符串排序,通过指针数组调整指向顺序而非移动实际数据可提高效率。使用时需确保每个指针指向有效内存区域。
2025-05-27 00:11:53
1168
1
原创 C语言的标准输入输出总结
本文总结了C语言中常见输入输出函数的使用要点。scanf()读取字符串时会跳过前导空白,而%c会读取所有字符;printf()遇到\0会终止输出。getchar()逐个读取字符(含空格),常用于清理输入缓冲区。fgets()安全读取含空格的字符串并自动添加\0,需注意换行符处理;puts()输出字符串并自动换行。特别强调已被废弃的gets()存在缓冲区溢出风险,绝对不要使用。文章通过代码示例演示了各函数的特性及常见问题解决方案,尤其对输入缓冲区的处理技巧进行了详细说明。
2025-05-24 23:00:33
1529
原创 在递归中使用前置++ 后置++传参,可能出现的问题
注意,在前置++里面,++以后的str,会先保存在原本的栈帧,然后再复制拷贝到新栈帧,也就是调用函数所产生的新栈帧。同时,tmp先不填充进去的时候,我们还要在每次递归的时候,对于f—e—d,依次填充为\0,来保证我们求的长度准确。,用来存放它里面的元素,所以每次调用函数的时候,tmp,保存在不同的位置,他们之间并不会覆盖冲突。在第二次的时候,f—bcdea,我们并不是让b和a换位置,我们在求长度的时候,是要把a舍去的。注意,在str+1里面,每个str,本身的值不会变,只是会用str+1,来进行传参。
2025-02-12 22:28:46
673
原创 字符串逆序(递归实现)
答案并不会,我们每次调用函数,都会分别为它创建一个栈区,用来存放它里面的元素,所以每次调用函数的时候,tmp,保存在不同的位置,他们之间并不会覆盖冲突。同时,tmp先不填充进去的时候,我们还要在每次递归的时候,对于f—e—d,依次填充为\0,来保证我们求的长度准确。while循环,定义一个变量count,数组里面的元素,如果不是\0,就让count+1,最后返回count。逆序之后数组的内容变成:fedcba。在第二次的时候,f—bcdea,我们并不是让b和a换位置,我们在求长度的时候,是要把a舍去的。
2025-02-09 23:30:43
379
原创 C语言小游戏——猜数字
这个循环是一开始要直接进入的,让玩家一开始就可以选择,所以我们选用了do while循环,条件是input,同时,因为非零为真,零为假,所以玩家如果没有输入0,主动退出游戏的话,程序是不会结束的。并且我们的srand函数只能引用一次,因为如果我们一秒内猜测了两次数,此时srand函数种子值来不及变,就会导致伪随机数序列也是相同的,也就是每局游戏的数字都是相同的。就是每一次的随机数序列都是一样的,而且刚输出完序列中的第一个数,这个种子值就马上刷新为一个相同的数,也就导致了 每一次输出的随机数都是一样的。
2024-12-23 23:41:41
587
原创 给未来自己的一封信
后来,来了大学读了机械专业,学校没有生物专业,但又不想放弃自己曾经热爱的东西,就想转专业到计算机,想着以后可以从计算机跨考到生物信息学,想着搞交叉领域更能有所突破,不过,这一切真的道阻且长。不知道现在的你是否还坚持着当年的理想,记得中学阶段的你是很喜欢生物这个学科的,常常对某些小细节钻研半天,沉浸于这种发现问题,并且钻研半天后了解问题本质的成就感。对了,你还记得,你当初很想去的那所大学吗,哈哈,虽然18岁那年没有去成,所以有点遗憾,但我期望,你能在20出头的年纪去弥补你18岁那年留下的遗憾。
2024-11-23 22:26:13
316
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅