- 博客(95)
- 收藏
- 关注
原创 12.31 - 相交链表 && 引用的优势
本文介绍了相交链表问题的解法及引用的优势。对于相交链表问题,解法核心是让两个指针走相同路程后同步前进,通过计算链表长度差并调整指针位置,最终找到相交节点。具体步骤包括遍历链表获取长度、判断尾节点、调整指针步数差和同步移动指针。关于引用优势,主要包括效率高(类似指针但无额外开销)、语义清晰(直接代表原对象)、安全性高(必须初始化且不可重新绑定)以及函数参数传递更高效。这些方法能有效解决问题并提升代码质量。希望这些内容对大家有所帮助,感谢大家的三连支持!
2025-12-31 13:04:08
278
原创 12.30 - 合并区间 && C++中class和C语言中struct的区别
本文包含两部分内容:1. 合并区间算法解析:介绍LeetCode 56题的解法,通过排序区间起始点后遍历合并重叠区间,核心步骤包括排序、初始化结果数组、遍历合并重叠区间。2. C++中class与C语言struct的区别:对比两者的默认访问权限(private/public)、继承方式、成员功能(class支持成员函数)、面向对象特性(class支持封装继承多态)以及用途差异(class用于对象模型,struct常用于数据聚合)。希望这些内容对大家有所帮助,感谢大家的三连支持!
2025-12-30 22:10:10
290
原创 12.29 - 字符串相加 && vector和map的区
本文包含两部分内容:1. 字符串相加算法解析,通过模拟手工加法过程,从字符串末尾开始逐位相加处理进位,最终返回和字符串;2. vector和map容器的对比分析,指出vector作为动态数组适合随机访问,map基于红黑树适合键值查找,同时说明两者作为STL容器的共性特点。文章提供了算法实现代码和容器特性对比表格,帮助理解不同数据结构的适用场景。希望这些内容对大家有所帮助,感谢大家的三连支持!
2025-12-29 22:46:48
767
原创 12.26 - 合并K个升序链表 && 面向对象3大特性
摘要:本文包含两部分内容:1) LeetCode 23题"合并K个升序链表"的解决方案,采用最小堆(优先队列)算法,通过不断取出最小节点并更新堆来高效合并链表;2) 面向对象编程三大特性(封装、继承、多态)的概念解析,包括各自定义、作用及实际应用场景。代码部分展示了C++实现,使用自定义比较器和优先队列处理链表合并问题。理论部分通过具体示例阐释了三大特性在软件开发中的重要性。希望这些内容对大家有所帮助,感谢大家的三连支持!
2025-12-26 22:44:07
937
原创 12.25 - 重排链表 && NULL与nullptr的区别
【摘要】本文介绍了LeetCode 143题"重排链表"的解法,核心思想是将链表分为前后两部分,反转后半部分后交替合并。具体步骤:1)使用快慢指针找到中点;2)反转后半链表;3)交替合并两部分。此外还对比了NULL与nullptr的区别:NULL可能被定义为0导致类型模糊,而nullptr是C++11引入的明确空指针类型,具有更好的类型安全性和可读性。该解法时间复杂度O(n),空间复杂度O(1)。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-25 21:23:04
825
原创 12.24 - 螺旋矩阵 && 指针和引用的区别
本文摘要: 螺旋矩阵问题通过定义四个边界(top/bottom/left/right)并按顺时针方向逐层遍历矩阵元素。核心步骤包括:1)从左到右遍历上边界;2)从上到下遍历右边界;3)检查并遍历下边界;4)检查并遍历左边界,每次遍历后更新边界值直到所有元素被访问。指针与引用的主要区别在于:指针可为空且可重绑定,需解引用操作;引用必须绑定有效对象且不可重绑定,语法上直接使用。指针适合动态内存管理,引用适合函数参数传递优化。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-24 22:29:45
241
原创 12.23 - 最长递增子序列 && 数组与链表的优缺点
本文介绍了最长递增子序列的解法与数组/链表的优缺点。最长递增子序列问题通过动态规划解决,维护dp数组记录以每个元素结尾的最长递增序列长度,最终取最大值。时间复杂度O(n²)。数组优势在于随机访问高效(O(1))和缓存友好,但插入删除效率低;链表则插入删除高效(O(1))且大小灵活,但随机访问慢(O(n))。数组适合频繁随机访问场景,链表适合频繁增删场景。两者各有所长,应根据具体需求选择。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-23 19:38:00
499
原创 12.22 - 环形链表 && sizeof和strlen区别
本文摘要:文章包含两部分内容:1.环形链表的检测方法,通过快慢指针(快指针两步/慢指针一步)遍历链表,若相遇则有环,否则无环;2.sizeof与strlen的区别:sizeof是编译时计算内存大小的运算符,适用于各种数据类型,而strlen是运行时计算字符串长度的函数,仅适用于以'\0'结尾的字符数组。sizeof包含结束符,strlen不包含。全文通过代码示例和对比表格清晰说明了两种技术的实现原理和应用场景。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-22 22:46:36
279
原创 12.21 - 二叉树的锯齿形层序遍历 && volatile关键字的内存屏蔽是怎么样的
本文包含两部分内容:1. 二叉树的锯齿形层序遍历算法解析,采用DFS递归实现,通过标志变量控制每层节点值的正序/逆序存储;2. volatile关键字的特性说明,重点分析其防止指令重排和保证内存可见性的机制。第一部分详细说明了算法实现步骤,包括递归处理左右子树和切换方向标志;第二部分解释了volatile如何通过内存屏障确保多线程环境下的数据一致性。两部分均采用技术性语言阐述核心原理和实现细节。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-21 12:21:47
514
原创 12.20 - 反转链表II && 传值和传地址的区别
本文包含两部分内容:1. 反转链表的递归实现方法:通过递归定位需要反转的链表区间,从后往前进行节点反转,并维护前后连接。关键步骤包括判断反转起点、递归到指定位置、执行局部反转和连接前后链表。2. 传值与传地址的区别:传值传递的是数据副本,函数内修改不影响原数据;传地址传递的是数据内存地址,函数内修改会直接影响原数据。两种方式在参数传递效果上有本质差异。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-20 23:17:28
105
原创 12.19 - 买卖股票的最佳时机 && const的作用
本文介绍了两个编程知识点:1) 股票买卖最佳时机算法:通过一次遍历数组,记录最低买入价并计算最大利润,时间复杂度O(n)。2) const关键字的作用:用于定义常量、保护指针和函数参数,提高代码安全性和可读性,同时支持编译器优化。内容涵盖算法实现思路和const的多种应用场景,适合编程学习者参考。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-19 23:47:22
719
原创 12.18 - 有效的括号 && C语言中static的作用
本文包含两个技术要点:1.括号匹配算法采用栈结构处理,遍历字符串时左括号入栈,右括号则检查栈顶匹配性,最终通过栈空判断有效性。2.C语言中static关键字的三种用途:使局部变量持久化、限制全局变量/函数作用域至当前文件,以及将变量存储在全局数据区。static实现了"内部持久化"和"内部封装"功能。文章通过代码示例和分步说明清晰阐述了这两个编程概念的核心实现逻辑。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-18 23:15:18
258
原创 12.17 - 合并两个有序数组 && include<> 和 include““ 的区别
本文包含两个技术要点:1. 合并有序数组的算法实现,采用双指针法从数组末尾开始比较和合并,确保时间复杂度为O(m+n);2. C++中#include<>和#include""的区别,前者优先搜索系统路径,后者先搜索本地路径再转系统路径,分别适用于标准库和自定义头文件的引用。通过代码示例和要点分析,清晰说明了两种技术的关键实现方法和应用场景。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-17 23:06:37
256
原创 12.16 - 全排列 && C语言中声明和定义的区别
本文包含两部分内容:1. 全排列问题的回溯算法解法,通过递归交换元素位置生成所有排列,当处理到数组末尾时将当前排列加入结果集,最后回溯恢复数组状态;2. C语言中声明与定义的区别,指出声明仅告知标识符存在而不分配内存,定义则分配内存并创建实体,强调定义只能出现一次而声明可多次,并举例说明变量、函数和结构体的声明与定义方式,以及头文件的作用。两部分内容分别介绍了算法实现和语言特性的核心要点。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-16 22:52:33
836
原创 12.15 - 两数之和 && 两个浮点类型不可以直接判断相等以及解决方案
本文摘要:文章介绍了两个编程常见问题的解决方案。首先讲解LeetCode"两数之和"问题,通过哈希表存储数值和索引,一次遍历即可高效找到满足条件的元素对。其次针对浮点数比较问题,指出直接判断相等的不可靠性,建议采用误差范围方法(绝对误差或相对误差)进行判断。两种方法都体现了对计算精度和算法效率的优化考量。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-15 23:17:56
329
原创 12.14 - 搜索旋转排序数组 && 判断两个结构体是否相等
本文包含两部分内容:1. 旋转排序数组搜索算法,通过二分查找确定有序区间逐步缩小范围,时间复杂度O(logn);2. 结构体比较方法,包括默认比较、特殊处理指针/数组成员以及重载==运算符三种方式。分别针对不同场景提供了高效的数据查找和结构体比较解决方案。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-14 23:05:42
673
原创 12.13 - 岛屿数量 && C语言中extern关键字的作用
本文包含两个技术要点:1. LeetCode岛屿数量问题的解法,通过DFS/BFS遍历二维网格,标记相连陆地并计数;2. C语言extern关键字的作用,用于声明外部变量/函数,实现跨文件访问。两种算法思路和语言特性都配有详细实现步骤说明。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-13 23:58:20
433
原创 12.12 - 二叉树的层序遍历 && C语言函数指针和指针函数的区别
本文包含两个技术要点:1. 二叉树的层序遍历算法,采用BFS策略通过队列实现,详细说明了从根节点开始逐层处理节点的步骤;2. 区分C语言中的函数指针(指向函数的指针)和指针函数(返回指针的函数),通过定义形式和典型用法阐明二者的本质差异。前者用于间接调用函数,后者用于返回地址数据。全文提供了清晰的技术解析和实现方案。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-12 23:33:33
590
原创 12.11 - 最长回文子串 && main函数是如何开始的
本文介绍了最长回文子串问题的中心扩散解法。该方法遍历字符串,以每个字符为中心向两边扩散寻找回文串,同时处理奇偶长度情况。时间复杂度为O(n²),空间复杂度O(1)。程序执行流程为:操作系统加载→运行时库初始化→调用main()→执行用户代码→返回退出码。该算法通过记录最长回文子串的起始位置和长度,最终返回对应的子串。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-11 23:06:47
232
原创 12.10 - 合并两个有序链表 && 对字节对齐的理解
摘要:本文包含两部分内容:1. 合并两个有序链表的算法实现,采用双指针法遍历比较节点值,按序拼接成新链表,通过虚拟头节点简化操作,最后处理剩余节点。2. 字节对齐的原理与应用,说明其通过按特定边界存储数据来提升CPU访问效率,涉及对齐原则、填充机制及在结构体设计等场景的实际应用。两部分分别从算法实现和计算机底层原理角度阐述技术要点。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-10 23:18:37
409
原创 12.9 - 排序数组 && 野指针和空指针的区别
本文包含两个技术要点:1. 快速排序实现方案,采用随机化枢轴选择和原地分区策略,通过分治递归实现高效排序,时间复杂度O(nlogn);2. 野指针与空指针的区别,从定义、成因、危害和规避方法四方面对比,野指针因未初始化或内存释放导致危险,空指针则是显式赋值为null的安全状态。全文提供了清晰的算法实现和重要的指针安全知识。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-09 22:53:16
337
原创 12.8 - 最大子树组和 && 如何防止编译器优化
本文包含两个技术要点:1. 最大子数组和的动态规划解法,通过维护当前子数组和(cur)和全局最大值(ret),在O(n)时间内解决问题。2. 防止编译器优化的三种方法:使用volatile关键字、编译器指令(O0选项/内存屏障)和函数属性(noinline)。前者是经典算法问题,后者是编程优化技巧,适用于需要精确控制代码执行场景的开发需求。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-08 14:43:31
790
原创 Linux - 网络基础概念
本文概述计算机网络基础,重点包括:网络从独立计算机向LAN/WAN的发展历程;协议作为通信约定的本质及标准化重要性;OSI七层与TCP/IP四/五层模型及其分层优势;网络传输中MAC地址、IP地址作用及数据封装流程;Socket编程中IP与端口组合、TCP/UDP对比及基本API。文章理论结合实例,阐明网络架构与通信机制,为网络编程学习奠定基础。希望这些对大家有所帮助,感谢支持!
2025-12-07 21:50:54
1519
1
原创 12.7 - 三数之和 && 断言(assert)的用法
本文介绍了两个编程知识点:1. "三数之和"算法解法,通过排序数组后固定一个数,使用双指针法在剩余区间寻找和为0的组合,并跳过重复值实现去重;2. 断言(assert)的用法,用于开发阶段验证程序假设,条件不满足时终止程序并报错,可通过NDEBUG宏禁用。文章详细说明了算法思路、实现步骤和断言的使用场景及注意事项。希望这些内容对大家有所帮助!
2025-12-07 21:40:42
387
原创 12.6 - K个一组翻转链表 && C 编译到执行的4个阶段
【摘要】本文包含两个技术要点:1) K个一组翻转链表的算法实现,通过哨兵节点和指针操作实现分组翻转,处理不足k个节点的边界情况;2) C语言编译执行的四个阶段(预处理、编译、汇编、链接)。前者详细解析了分组定位、三指针翻转和链表重连的核心逻辑,后者简要提及编译流程。算法实现采用迭代方式,时间复杂度O(n),空间复杂度O(1)。希望这些内容对大家有所帮助!
2025-12-06 23:59:11
366
原创 12.5 - 二叉树的最近公共祖先 && 构造函数和析构函数可以是虚函数吗
本文包含两个技术要点:1. 二叉树最近公共祖先(LCA)问题的递归解法:通过后序遍历,判断当前节点是否为p/q或左右子树包含目标节点来确定LCA。当左右子树均找到目标节点时返回当前节点,否则返回非空子树结果。2. 虚函数问题:构造函数不能为虚函数(对象构造时虚表未建立),析构函数应为虚函数(确保通过基类指针删除派生类对象时能正确调用派生类析构函数,避免内存泄漏)。这两个知识点分别涉及算法设计和C++面向对象编程的重要概念。希望这些内容对大家有所帮助!
2025-12-05 23:53:09
646
原创 读写锁与自旋锁
摘要:本文系统介绍了多线程编程中的三种同步机制:读者写者模型、读写锁和自旋锁。读者写者模型通过"321"原则实现读写并发控制,其中读者可并发访问而写者需互斥。读写锁针对多读少写场景设计,提供读者优先和写者优先两种策略,分别可能导致写者或读者饥饿。自旋锁采用忙等待机制,适用于短时锁竞争,虽降低线程切换开销但可能浪费CPU资源。文章通过伪代码和示例程序详细说明了三种机制的实现原理、接口使用及适用场景,为多线程编程提供了实用的同步解决方案。希望这些内容对大家有所帮助!
2025-12-05 15:00:00
725
原创 12.4 - 数组中的第K个最大元素 && 全局变量和局部变量的区别
本文包含两部分内容:1. 使用最大堆解决"数组中第K个最大元素"问题,通过构建优先队列并弹出前K-1个元素来获取结果。2. 比较全局变量与局部变量的区别,包括作用域(全局/局部范围)、生命周期(程序运行期/代码块内)和存储位置(数据段/栈区)三个维度。算法部分详细说明了使用priority_queue实现最大堆的步骤,而变量部分则通过对比表格清晰展示了两类变量的核心差异。希望这些内容对大家有所帮助!
2025-12-04 18:58:32
349
原创 线程同步与互斥(下)
本文介绍了线程池设计与实现的关键技术。主要内容包括:1)基于策略模式的日志系统设计,支持控制台和文件两种输出方式;2)线程池实现方案,包括固定线程数线程池的工作原理和应用场景;3)线程安全的单例模式实现,重点讲解了饿汉式和懒汉式两种方式;4)线程安全与可重入问题的分析;5)常见锁概念,包括死锁的产生条件和避免方法;6)STL容器和智能指针的线程安全性讨论。文章通过代码示例详细展示了线程池的核心实现逻辑,包括任务队列管理、线程调度等关键环节,为构建高性能并发系统提供了实用参考。希望这些内容对大家有所帮助!
2025-12-04 09:00:00
1004
原创 12.3 - 反转链表 && 判断系统大小端存储模式
本文摘要: 链表反转:通过三指针法(前驱、当前、后继)遍历链表,逐个反转节点指向,最终返回新头节点。核心步骤包括初始化指针、遍历反转和返回结果。2. 大小端判断:利用联合体特性,通过检查低地址字节内容判断存储模式。3. 内存对齐:介绍了结构体对齐规则(首成员偏移0、成员对齐数取最小值、总大小为最大对齐数倍数),分析了空间换时间的性能优势,并展示了修改默认对齐数的方法和offsetof宏的用法。希望这些内容对大家有所帮助!
2025-12-03 17:25:48
538
原创 线程同步与互斥(上)
本文系统介绍了线程同步与互斥的核心机制。主要内容包括:1)线程互斥方面,详细讲解了互斥量mutex的实现原理、接口封装和使用方法,通过售票系统案例展示了如何避免竞态条件;2)线程同步方面,重点阐述了条件变量的工作原理和使用规范,并实现了基于阻塞队列的生产者消费者模型;3)介绍了POSIX信号量的基本概念和接口封装,构建了基于环形队列的生产者消费者模型。文章通过大量代码示例,深入分析了互斥锁、条件变量和信号量在多线程编程中的应用场景和注意事项。希望这些内容对大家有所帮助,感谢大家支持!
2025-12-03 09:00:00
783
原创 12.2 - LRU缓存 && C语言内存布局
本文摘要: LRU缓存实现: 使用哈希表快速查找键值对,双向链表维护访问顺序 核心操作:get()获取值并移动节点到头部,put()插入/更新节点 注意迭代器失效问题,推荐使用splice操作而非删除重建 C程序内存分区: 代码区(只读指令) 静态区(全局/静态变量) 栈区(函数调用、局部变量) 堆区(动态分配内存) 命令行参数区 注意事项包括栈溢出、内存泄漏等问题,需理解各区域特性和生命周期。
2025-12-02 19:00:49
898
原创 线程概念与控制(下)
本文详细介绍了Linux系统中的线程控制与管理。主要内容包括:1) POSIX线程库的使用方法及线程创建;2) 线程终止的三种方式和线程等待;3) 线程分离的概念与实现;4) 线程ID的本质及进程地址空间布局;5) 线程封装实现(Thread类);6) 补充内容包括线程栈特性、clone系统调用和线程局部存储(__thread)。文章通过代码示例详细演示了线程创建、控制和管理的关键技术,并分析了Linux线程实现的底层机制。希望这些内容对大家有所帮助,感谢支持!
2025-12-02 14:00:00
1520
原创 线程概念与控制(上)
本文系统阐述了Linux系统中线程的概念及其实现机制。首先介绍了线程的基本定义,指出线程是进程内部的执行分支,在Linux中采用轻量级进程模拟实现。重点分析了分页式存储管理机制,包括虚拟地址与页表转换、两级页表结构、缺页异常处理等核心原理。通过对比进程与线程的区别,阐明线程共享进程资源的特点及其优缺点:线程创建和切换开销小,但缺乏访问控制和保护机制。全文深入剖析了Linux线程的资源划分本质是对虚拟地址空间的划分,为理解多线程编程提供了理论基础。希望这些内容对大家有所帮助!
2025-12-02 09:00:00
987
原创 12.1 - 无重复字符的最长子串 && switch注意事项
4. 变量作用域与定义 -> 在case块内声明变量时,必须用{}限定作用域,否则变量会泄露到整个switch块,导致重复定义错误。② 显式穿透标注 -> 使用[[fallthrough]]属性标记故意穿透(c++17特性)5. default子句 -> default用于处理未匹配任何case的情况,可放在任意位置(也可省略)① 默认执行穿透 -> 若缺少break,程序会继续执行下一个case的代码。7. 无法直接匹配范围 -> c++不支持case1:case2:case3:...语法。
2025-12-01 20:35:23
310
原创 Linux进程信号(下)
本文主要介绍了Linux系统中的信号处理机制,包括信号的基本概念(递达、未决、阻塞)、内核中的表示方式(block位图、pending位图、handle函数指针数组),以及信号集操作函数(sigemptyset、sigaddset等)。文章还详细讲解了信号捕捉流程、内核态与用户态的切换原理,以及SIGCHLD信号处理僵尸进程的方法。通过分析CPU指令集权限和内存空间划分,阐述了用户态和内核态的区别及切换过程,帮助读者深入理解操作系统信号处理的核心机制。希望这些内容对大家有所帮助!
2025-10-21 08:00:00
1378
原创 Linux进程信号(上)
本文从生活和技术角度系统介绍了Linux信号机制。信号是进程间异步事件通知的软中断方式,其处理包括忽略、默认动作和自定义捕捉三种。信号产生来源多样:终端按键(如Ctrl+C)、系统命令(kill)、函数调用(kill/raise/abort)、软件条件(alarm/SIGALRM)和硬件异常(除零/SIGFPE)。重点解析了信号处理流程、前台/后台进程区别、core dump原理及可重入函数概念,并通过代码示例演示了信号注册、捕获和处理的完整过程。希望这些内容对大家有所帮助!
2025-10-19 15:00:00
1385
原创 进程间通信(下)
System V共享内存是进程间通信最快的方式,通过内核数据结构管理。主要函数包括:shmget创建共享内存,shmat连接共享内存到进程空间,shmdt分离共享内存,shmctl控制共享内存。数据结构shmid_ds和ipc_perm用于管理共享内存属性和权限。借助管道可实现访问控制版的共享内存,确保数据完整性。示例代码展示如何使用共享内存和命名管道实现client每写两个字母,server读取一次的功能。还提及了System V的消息队列、信号量及内核对IPC资源的组织管理。希望这些内容对大家有所帮助!
2025-10-19 09:35:29
944
原创 进程间通信(上)
本文系统介绍了进程间通信(IPC)的核心概念与实现方式。首先阐述了IPC的本质是让不同进程访问同一份内存资源,主要通过管道、SystemV IPC和POSIX IPC三类机制实现。重点讲解了匿名管道和命名管道的原理与使用:匿名管道通过pipe()创建,适用于父子进程通信;命名管道通过mkfifo()创建,支持无亲缘关系进程通信。文章通过多个代码示例详细展示了管道的读写规则、五种特性和四种常见场景,并实现了一个完整的进程池任务处理系统和命名管道通信案例。希望这些内容对大家有所帮助!
2025-10-18 16:06:55
1164
原创 C++智能指针的原理与应用
本文系统介绍了C++智能指针的原理与应用。首先通过内存泄漏案例展示了传统指针管理的缺陷,引出RAII设计思想和智能指针的价值。随后详细解析了C++标准库中的四种智能指针:auto_ptr、unique_ptr、shared_ptr和weak_ptr。重点探讨了shared_ptr的引用计数实现原理、线程安全问题及解决方案,以及weak_ptr如何打破循环引用。最后总结了智能指针的选择策略:优先使用unique_ptr,需要共享时使用shared_ptr,循环引用场景配合weak_ptr。希望对大家有所帮助!
2025-10-15 14:00:00
819
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅