- 博客(401)
- 收藏
- 关注
原创 leetcode_3010 将数组分成最小总代价的子数组 I
摘要:题目要求将数组分成三个子数组,使每个子数组的代价(首元素)之和最小。解法包括:1. 排序后取前三个元素(O(nlogn));2. 遍历数组维护最小和次小值(O(n))。最终代价为数组首元素加上剩余元素中的两个最小值。参考0x3f的解法优化了时间复杂度。
2026-02-01 08:59:47
399
原创 HCIP笔记10--路由策略(filter-policy)
摘要 本文介绍了路由控制的基本概念和实现方法。路由控制是通过策略工具对路由条目进行管理,包括路由加表、选路和属性修改。配置步骤包括抓取路由(使用ACL或前缀列表)、过滤和调用。ACL用于匹配路由前缀但无法区分掩码长度,而前缀列表可以更精确地匹配路由前缀和掩码。文中通过实验演示了filter-policy在RIP和OSPF中的应用,展示了不同路由协议下过滤策略的差异:距离矢量协议直接过滤路由信息,而链路状态协议过滤计算后的路由但不影响LSA传播。
2026-01-14 22:47:31
686
原创 HCIP笔记9--中间系统到中间系统协议2
本文介绍了IS-IS协议中的链路级别控制、邻居建立机制和路由计算过程。主要内容包括:1)通过配置链路级别(L1/L2)控制邻居关系建立,确保骨干区域仅建立L2邻居;2)IS-IS邻居状态转换过程(Down→Init→Up)及建立条件;3)广播网络和P2P链路上不同的LSDB同步机制;4)LSP的分类、标识和更新方式;5)基于Dijkstra算法的路由计算,包括实节点和伪节点LSP的作用;6)多区域通信原理,L1-2路由器在区域间路由传播中的角色。文章还涉及开销值配置、缺省路由生成条件等实用配置内容。
2025-12-09 22:49:25
791
原创 HCIP笔记7--OSPF特殊区域(nssa、totally nssa)、路由汇总
本文介绍了OSPF中特殊区域NSSA(非完全末节区域)的原理与应用。NSSA区域通过7类LSA引入外部路由,同时避免处理过多外部路由信息。文章详细解析了7类LSA的结构、7类转5类LSA的机制、多ABR环境下的次优路径问题及解决方案,以及7类LSA中FA地址的选择规则。此外还探讨了完全NSSA区域特性、LSA优先级和路由汇总技术,包括区域间路由汇总和外部路由汇总的具体配置方法及注意事项。最后解释了Loopback接口在OSPF中默认32位掩码的原因。全文通过拓扑图和命令示例,系统性地阐述了OSPF特殊区域的
2025-12-02 20:53:30
829
原创 HCIP笔记5--OSPF域间路由、虚链路、认证
本文主要介绍了OSPF协议中的三类LSA、防环机制、虚链路配置及其应用场景,以及OSPF认证相关内容。三类LSA用于传递路由信息,只有加表的路由才会被泛洪;OSPF通过骨干区域与非骨干区域的划分以及ABR路由器的功能实现防环。虚链路可用于解决非骨干区域与骨干区域间的路由传递问题,防止骨干区域分割,优化链路选择,但配置不当可能导致环路。此外,文章还介绍了OSPF的认证机制,包括区域认证和接口认证的优先级关系。通过实例分析帮助理解各类技术要点及其实际应用场景。
2025-11-16 21:11:24
1234
原创 leetcode_108 将有序数组转为二叉平衡树
题目要求将升序排列的整数数组转换为平衡二叉搜索树。解题思路是选取数组中间元素作为根节点,然后递归构造左右子树,确保平衡性。具体实现中,通过二分查找定位中间元素,递归处理左右子数组构建子树。这种方法能保证树的高度平衡,时间复杂度为O(n)。代码示例展示了这一过程,将数组转换为平衡二叉搜索树。
2025-10-08 10:41:03
166
原创 leetcode_1382 将二叉搜索树变平衡树
本文介绍了如何将二叉搜索树转换为平衡二叉搜索树。方法是通过中序遍历获取有序序列,然后递归选取中间元素作为根节点构建平衡树。文章详细分析了该策略的正确性,证明其能保证左右子树高度差不超过1。最终通过数学归纳法验证了该方法的有效性,确保生成的树满足平衡条件。
2025-10-08 10:32:34
1083
原创 leetcode_146 LRU缓存
文章摘要: 本文讨论如何实现一个LRU缓存机制,要求在O(1)时间内完成get和put操作。解决方案采用哈希表+双向链表结构,其中哈希表存储键值对,双向链表维护访问顺序。作者提供了两种实现方案:一种是直接实现双向链表,需处理头尾节点特殊情况;另一种是参考0x3f的方案,引入哨兵节点简化边界条件判断。两种方案都通过移动节点位置来维护最近访问顺序,并在容量超限时从链表尾部删除最久未使用的节点。
2025-09-26 10:19:33
517
原创 leetcode_138 随机链表的复制
本文介绍了两种复制带随机指针的链表的解法。第一种是哈希表法,通过递归或迭代遍历原链表,用哈希表记录新旧节点的对应关系,从而正确复制随机指针。第二种是奇偶链表法,通过将新节点插入原链表相邻节点之间,建立对应关系后再拆分链表。两种方法的时间复杂度均为O(n),空间复杂度分别为O(n)和O(1)。文章提供了详细的代码实现和参考链接,适合准备面试的开发者学习。
2025-09-25 23:02:26
420
原创 C++开源库使用:nlohmann/json
本文介绍了使用C++开源库nlohmann/json进行JSON解析和序列化的方法。作者通过CMake的FetchContent引入该头文件库,并展示了基本的JSON文件解析操作。重点说明了如何为自定义结构体avl_test_case和枚举类型avl_op_tp实现JSON序列化功能:既可以使用NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE宏简化操作,也可以通过特化adl_serializer实现更精细的控制。文章还演示了JSON文件的读写管理,包括初始化空文件、解析现有文件以及格式化
2025-09-24 23:23:36
656
原创 CMake集成asan内存检查工具
本文介绍了如何在C/C++项目中启用AddressSanitizer(ASAN)内存检测工具。文章首先展示了在gcc中直接添加-fsanitize=address编译选项来检测内存泄漏的示例,演示了未释放malloc内存时的错误提示。随后介绍了如何将ASAN集成到CMake项目中,通过在CMakeLists.txt中添加option选项,使ASAN检测成为一个可配置的构建选项。用户只需在构建时添加-DASAN=ON参数即可启用内存检测功能。这种集成方式既方便了开发过程中的内存问题排查,又保持了构建系统的灵活
2025-09-24 22:41:32
316
原创 手写数据结构-- avl树
本文介绍了AVL树的基本原理与实现方法。AVL树是一种自平衡二叉搜索树,通过维护左右子树高度差不超过1来防止退化。文中详细讲解了四种旋转类型(左旋、右旋、左右旋、右左旋)及其适用场景,并分析了节点插入和删除时的平衡调整策略。特别指出删除节点可能导致连续失衡,需要从修改点回溯到根节点进行多次调整。文章还提供了代码实现参考,并推荐了可视化学习资源。相比去年实现,作者修正了只处理一次失衡的错误,改为持续回溯调整直至平衡。
2025-09-24 21:19:21
1069
原创 leetcode_142 环形链表II
本文介绍了判断链表中环的入口节点的两种方法:哈希表法和Floyd判圈法。哈希表法通过遍历链表并记录访问过的节点,空间复杂度为O(n)。Floyd判圈法使用快慢指针,通过数学推导找到环入口,空间复杂度为O(1)。两种方法的时间复杂度均为O(n),但Floyd判圈法更节省空间。
2025-09-17 10:32:47
753
原创 leetcode_148 排序链表
摘要 本文介绍了三种链表排序方法:1)数组排序法,将链表值存入数组排序后写回,时间复杂度O(nlogn),空间复杂度O(n);2)自顶向下归并排序,递归分割链表后合并,时间复杂度O(nlogn),空间复杂度O(logn);3)自底向上归并排序,通过迭代方式合并相邻子链表,避免了递归栈开销,但实现更复杂。三种方法各有特点,其中归并排序更符合链表特性,尤其是自底向上版本在空间效率上更优。
2025-09-15 10:49:46
639
原创 leetcode_ 25 K个一组翻转链表
题目要求将链表的每k个节点一组进行翻转,不足k个的节点保持原序。解题思路是遍历链表,将每k个节点分割出来单独翻转,再重新连接,注意处理前后驱指针。算法时间复杂度为O(n),空间复杂度为O(1)。关键点在于维护好翻转前后的头尾节点连接,以及处理边界条件(如链表长度不足k的情况)。
2025-09-14 08:41:57
161
原创 leetcode_21 合并两个有序链表
本文介绍了合并两个有序链表的两种解法:递归和迭代。递归方法通过比较链表头节点,将较小节点的next指向递归结果;迭代方法使用虚拟头节点和尾指针,依次连接较小节点直到某链表为空。两种方法时间复杂度均为O(n),空间复杂度分别为O(n)和O(1)。
2025-09-14 08:15:54
221
原创 C++ 踩坑:忘写返回值
文章摘要: 在实现AVL树的插入函数时,遗漏了返回插入成功与否的布尔值导致程序崩溃。代码中虽然完成了节点插入和平衡调整的逻辑,但缺少最后的return true语句。这种疏忽会导致函数返回未定义值,进而引发"非法指令"错误。调试时应检查所有控制路径的返回值,确保函数完整性。该问题突出了边界条件检查的重要性,特别是在涉及内存操作和递归调用的场景中。
2025-09-05 10:04:44
170
原创 leetcode_141 环形链表
判断链表是否有环的两种解法:1.哈希表法:遍历链表,将节点存入哈希表,若遇到重复节点则有环。时间复杂度O(n),空间复杂度O(n)。2.快慢指针法:快指针每次走两步,慢指针每次走一步,若相遇则有环。时间复杂度O(n),空间复杂度O(1)。两种方法都有效,但快慢指针更节省空间。
2025-09-04 11:55:27
1036
原创 leetcode_ 160 相交链表
摘要 本文介绍了查找两个单链表相交节点的两种方法:哈希表和相交拼接。哈希表法通过存储一个链表的节点,再遍历另一个链表查找匹配;相交拼接法利用链表拼接后的长度特性,通过双指针遍历找到交点。两种方法的时间复杂度均为O(m+n),空间复杂度分别为O(m)和O(1)。代码实现展示了两种方法的详细步骤,适用于编程面试中的链表相关问题。
2025-09-03 15:12:26
331
原创 leetcode_234 回文链表
摘要 本文探讨了判断单链表是否为回文链表的四种方法: 链表转数组:将链表值存入数组,用双指针比较首尾元素。 栈反转:利用栈的后进先出特性,将链表值压栈后依次比较。 尾递归+变量标记:通过递归遍历链表,使用引用变量标记前驱节点进行比较。 反转后半部分链表:找到中间节点后反转后半部分,比较前后两部分后恢复原链表。 其中方法4虽然复杂但效率较高,综合运用了快慢指针和链表反转技巧。方法1-3空间复杂度较高,但实现简单。根据实际需求可选择不同方法。
2025-09-03 12:26:48
453
原创 leetcode_876 链表的中间元素
本文介绍了查找单链表中间节点的两种方法。暴力解法通过遍历链表存储节点到数组或先计算长度再定位中间节点;更优的快慢指针法使用两个指针,慢指针每次一步,快指针每次两步,当快指针到末尾时慢指针即指向中间节点。对于偶数节点情况,需返回第二个中间节点。快慢指针法更高效且优雅,时间复杂度为O(n)。
2025-09-03 11:32:21
370
原创 C++11: 拷贝消除与返回值优化(RVO)
摘要 本文探讨了C++中的拷贝消除和返回值优化(RVO/NRVO)机制,通过代码示例展示了编译器如何优化不必要的拷贝构造。未优化时,示例代码可能产生四次拷贝构造调用(两次对象初始化各两次),但开启优化后(如gcc -O0或msvc /Od),这些拷贝可被完全消除。文章还介绍了如何通过编译器选项(如gcc的-fno-elide-constructors)禁用优化来观察原始行为。这些优化是编译器行为而非语言标准,理解它们有助于编写高效代码。
2025-09-01 17:47:12
391
原创 C++17: 类模板参数推导
类模板参数推导(CTAD)是C++17引入的特性,允许编译器自动推导模板类的参数类型。例如std::vector arr = {1,2,3}无需显式指定类型。但CTAD不支持聚合类,需手动添加推导指引如Pair(T,U)->Pair<T,U>。此外,类内非静态成员初始化无法使用CTAD,必须显式指定类型。C++20部分解决了聚合类的问题。该特性简化了模板类使用,但仍存在一些限制需要注意。
2025-09-01 17:18:53
255
原创 C++ 11: 五种初始化方式
本文总结了C++中几种变量初始化方式:默认初始化(不推荐)、拷贝初始化(传统方式)、直接初始化、直接列表初始化(现代C++推荐)和值初始化。建议在大多数情况下使用大括号初始化,但指出了vector等容器初始化的特殊情况。此外,还介绍了类成员默认赋值的正确方式以及使用[[maybe_unused]]解决未使用变量警告的方法。这些初始化技巧有助于编写更安全高效的C++代码。
2025-09-01 16:22:40
413
原创 leetcode_240 搜索二维矩阵 II
本文探讨了在具有行列有序特性的二维矩阵中高效搜索目标值的方法。 方法一:逐行或逐列二分查找,时间复杂度为O(m log n)或O(n log m)。通过优化可以缩小搜索范围,先确定可能包含目标值的行区间再进行二分。 方法二:将矩阵视为二叉搜索树,从右上角开始搜索。若当前值大于目标值则左移,小于则下移,时间复杂度为O(m+n)。 两种方法均利用了矩阵的行列有序特性,其中二叉搜索树方法更为高效简洁。
2025-08-31 17:21:56
1063
原创 leetcode_74 搜索二维矩阵
这篇文章介绍了在满足特定条件的m×n整数矩阵中查找目标值target的几种方法。矩阵每行元素非严格递增,且每行首元素大于前一行末元素。解法包括暴力搜索(O(mn))、逐行二分(O(m logn))、整体二分(O(logm + logn))、两次二分(O(logm + logn))以及二叉搜索树方法(O(m+n))。最优解法是整体二分和两次二分,时间复杂度均为对数级别。文章还提供了相应的代码实现,并参考了三叶姐和LeetCode的解题思路。
2025-08-31 16:39:17
956
原创 leetcode_48 旋转图像
本文探讨了如何原地顺时针旋转90度n×n矩阵的三种方法。暴力解法通过新建矩阵实现旋转但不满足空间复杂度要求;转置+反转法先转置矩阵再反转每行,实现原地旋转;原地旋转法推导出四个位置的循环交换关系,通过分层处理实现高效旋转。第三种方法进一步优化为按层处理,减少边界条件判断。文章详细分析了每种方法的实现思路和代码,并提供了清晰的图示说明位置变换规律,帮助理解矩阵旋转的本质。
2025-08-31 15:35:46
793
原创 CS144 lab3 tcp_sender
实验摘要 本实验实现了TCP协议的发送端(TCPSender),负责从字节流读取数据、填充接收窗口、跟踪未确认的报文段并处理超时重传。主要功能包括: 报文发送:将字节流数据分割成不大于最大载荷的TCP段,加上SYN/FIN标记,确保不超过接收窗口范围。当接收方窗口为0时,按窗口为1处理以维持连接。 重传机制:维护未确认的报文队列,通过定时器检测超时并重传最早的未确认段。超时后RTO(重传超时时间)加倍,连续重传次数增加;收到新确认时重置RTO和重传计数。 特殊处理:正确生成空报文(用于ACK)、处理SYN/
2025-08-29 18:59:08
937
原创 leetcode_73 矩阵置零
本文探讨了矩阵置零问题的两种解法。第一种暴力解法使用额外空间记录行列标记,时间复杂度O(n),空间复杂度O(n)。第二种原地算法巧妙地利用矩阵第一行和第一列作为标记,通过预存首行首列状态,将空间复杂度优化到O(1)。文中详细分析了两种实现方式,并比较了不同标记策略的复杂度差异,最后给出了三种具体实现代码,包括使用额外变量和仅用矩阵首元素作为标记的优化方案。
2025-08-28 23:59:24
677
原创 Linux IPTables
本文简要介绍了Linux iptables防火墙工具。iptables通过表、链和规则组织网络包处理,主要包含raw、filter、nat、mangle和security五张表,每张表包含不同功能的链(如INPUT、FORWARD等)。最常用的是nat和filter表,分别用于地址转换和包过滤。文章解释了链的调用规则,并提供了常用命令示例,如查看、清空表、设置DNAT/SNAT和端口重定向等。最后列出了官方文档参考链接,建议用户查阅更详细资料。
2025-08-27 16:27:26
316
原创 I/O 多路复用:select、poll、epoll
select和poll是Linux系统中常用的I/O多路复用机制。select通过位操作管理文件描述符,受限于1024的最大数量,使用fd_set结构体数组来跟踪描述符状态。poll则没有数量限制,采用pollfd结构体管理事件,将读写事件合并处理,通过位与运算判断事件发生。两者都提供了高效的I/O监控能力,但poll在可扩展性和使用便利性上更优。示例代码展示了select和poll的基本用法,包括描述符设置和事件检测。
2025-08-27 10:47:01
760
原创 Linux IO模型:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO
本文介绍了五种I/O模型的特点和实现方式:1)阻塞I/O模型简单直接但会阻塞进程;2)非阻塞I/O通过轮询避免阻塞但消耗CPU;3)I/O多路复用单线程监听多个文件描述符;4)信号驱动I/O通过信号通知数据到达;5)异步I/O完全不阻塞进程。文章通过示意图和代码示例(包括信号处理和POSIX AIO)详细说明了每种模型的实现机制,分析了各自的优缺点,为理解不同I/O模型的工作方式提供了清晰的参考。
2025-08-26 20:44:32
482
原创 leetcode_ 41 缺失的第一个正数
本文介绍了寻找未排序数组中缺失的最小正整数的两种解法。暴力解法通过排序后遍历查找,时间复杂度为O(n log n)。更优的原地哈希法利用数组本身作为哈希表,通过置换或标记法实现O(n)时间复杂度和O(1)空间复杂度。置换法通过交换元素到正确位置,标记法将存在元素的位置标记为负数。两种方法最终都通过二次遍历找到第一个不符合条件的位置,确定缺失的最小正整数。
2025-08-26 11:14:01
307
原创 leetcode_189 轮转数组
本文介绍了三种解决数组循环右移k位的方法:1)使用临时数组存储移动后的元素,空间复杂度O(n);2)环状替换法,通过计算最大公约数确定替换轮次,时间复杂度O(n);3)三次反转法,通过反转整个数组和子数组实现高效移动。其中第三种方法最优,时间复杂度O(n)且空间复杂度O(1)。文章还分析了k取模运算的必要性和环状替换的数学原理。
2025-08-24 23:04:50
863
原创 Linux: TUN/TAP
本文介绍了Linux中的tun/tap虚拟网络设备。tun/tap设备是用户空间的虚拟网卡,通过用户空间直接收发数据包。tun工作在网络层,需要配置IP地址;tap工作在数据链路层,需要配置MAC地址。文章详细说明了使用ip命令配置tun/tap设备的方法,并通过CS144项目示例展示了具体实现。同时介绍了应用程序通过/dev/net/tun设备与内核交互的编程接口,需要使用ioctl系统调用注册设备。最后提供了相关参考文档链接。
2025-08-24 10:39:29
359
原创 C++20: std::span
摘要: std::span是C++20引入的一种轻量级视图,用于安全访问连续内存序列(如数组、vector等)。它能自动推导容器大小,支持数据修改(不同于std::string_view),提供subspan等切片操作。但需注意,C++26前不包含边界检查,越界访问会导致未定义行为。示例展示了其基本用法、数据指针获取及潜在风险,建议结合size()方法自行管理边界。参考cppreference和Modernes C++相关文档获取更多细节。 (148字)
2025-08-24 09:17:09
489
原创 C++ 20: Concepts 与Requires
摘要:C++20的Concepts特性通过约束模板参数类型,解决了传统模板编程中类型不匹配导致的复杂错误问题。文章介绍了Concepts的基本用法,如使用std::is_integral限制参数类型,比较了使用Concepts与传统模板在编译期错误检测上的差异。详细讲解了四种requires表达式(简单限制、类型限制、复合限制和内嵌限制)的定义方式,并通过求最大公约数、运算符重载等示例演示其应用。Concepts能显著提升模板代码的可读性和错误提示友好性,是泛型编程的重要改进。
2025-08-23 21:17:34
912
空空如也
模板实现bitset
2023-04-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1