- 博客(140)
- 收藏
- 关注
原创 Linux----Socket实现UDP简单服务器与客户端程序
本文介绍了Linux下UDP Socket编程的基础实现。主要内容包括:1. 使用recvfrom()和sendto()进行UDP数据收发的基本方法;2. 实现了一个UDP服务器示例,该服务器接收客户端命令字符串,执行后将结果返回;3. 详细解析了服务器端的初始化、绑定和运行流程;4. 解释了客户端隐式绑定的概念;5. 讨论了本机回环通信(127.0.0.1)与公网IP访问的区别,以及云服务器环境中可能出现的访问限制问题。文章通过具体代码示例展示了UDP Socket编程的核心步骤和注意事项。
2026-01-04 16:55:15
1084
原创 Linux----Socket编程基础
摘要:IP地址用于定位网络中的主机,而端口号用于标识主机上的具体进程。网络通信本质上是跨网络的进程间通信,通过Socket(IP+端口号)实现。端口号分为知名端口(0-1023)和动态端口(1024-65535),确保数据能准确传递给目标进程。传输层协议使用网络字节序(大端)保证数据传输一致性。Socket API提供统一的网络编程接口,支持IPv4/IPv6等不同协议,通过sockaddr结构实现多态处理。
2026-01-01 20:21:40
1087
原创 最小栈(栈)
摘要:本文介绍了一种使用双栈实现最小栈的方法。主栈source存储正常元素,辅助栈minval保存当前最小值。关键点在于处理重复最小值:当新元素≤minval栈顶时入栈minval,出栈时若source栈顶等于minval栈顶则同步弹出。这样保证了getMin()始终返回minval栈顶元素,实现了O(1)时间复杂度获取最小值。该设计通过维护同步的最小值栈,解决了栈操作过程中最小值动态更新的问题。
2025-12-26 17:54:43
255
原创 C++----智能指针
本文介绍了C++智能指针技术及其实现原理。主要内容包括:1)传统指针在异常情况下易导致内存泄漏的问题;2)基于RAII技术的智能指针解决方案,通过对象生命周期自动管理资源;3)三种主要智能指针的实现:auto_ptr(管理权转移)、unique_ptr(禁止拷贝)和shared_ptr(引用计数);4)shared_ptr的循环引用问题及weak_ptr解决方案;5)智能指针的定制删除器功能,支持不同资源释放方式。文章通过代码示例详细展示了各类智能指针的实现机制,并比较了它们的特性和适用场景,为C++内存管
2025-12-26 10:52:35
573
原创 验证回文串,x的平方根(左右指针)
本文介绍了两个算法问题的双指针和二分查找解法。对于验证回文字符串问题,使用左右指针遍历字符串,当字符不匹配时可删除一个字符继续判断。对于平方根计算问题,采用二分查找在0到x范围内寻找满足k²≤x的最大k值,并通过安全计算中点避免整数溢出。两种方法都通过优化策略避免了暴力解法的高时间复杂度。
2025-12-24 16:11:17
290
原创 二叉树的右视图(BFS或DFS)
本文探讨了二叉树右视图问题的两种解法:BFS和DFS。BFS采用队列进行层序遍历,从右子树开始访问,每层第一个节点即为最右节点;DFS使用栈进行深度优先搜索,优先访问右子树,记录每层首次访问的节点。两种方法都通过哈希表记录每层的最右节点值,最终生成右视图结果数组。时间复杂度均为O(n),空间复杂度取决于树的高度。
2025-12-24 15:57:48
170
原创 最小高度树
摘要:本文探讨了寻找树的最小高度根节点问题。通过分析发现,最小高度树的高度等于最长路径长度的一半向上取整,其根节点必位于最长路径中点。提出两种解法:1)通过两次BFS找到最长路径中点;2)采用拓扑排序的"剥叶子"法,反复删除度为1的节点,最终剩余1-2个节点即为解。后者实现了O(n)时间复杂度的优化解法。核心思路是将根节点置于最长路径中间以平衡树高。
2025-12-22 23:20:13
328
原创 随机链表的复制(哈希表)
本文提出了一种使用哈希表解决链表深拷贝问题的方法。针对包含随机指针的链表复制,算法通过两次遍历实现:第一次遍历创建新节点并建立新旧节点映射关系;第二次遍历利用哈希表为新节点的random指针赋值。该方法时间复杂度O(n),空间复杂度O(n),通过unordered_map存储节点对应关系,确保了random指针的正确指向。关键点在于利用哈希表保存原始节点与拷贝节点的映射,从而在第二次遍历时快速查找对应的random节点。
2025-12-22 22:54:03
223
原创 分割链表(dummy的用法)
本文提出使用哨兵头节点优化链表分区操作。通过创建smallDummy和largeDummy两个哨兵节点,分别连接小于x和大于等于x的节点。遍历原链表时,将节点分类连接到对应哨兵链表,最后合并两个链表并返回smallDummy.next。哨兵节点的使用避免了处理头节点的特殊情况,简化了链表操作,提高了代码的可读性和效率。该方法空间复杂度O(1),时间复杂度O(n),是解决链表分区问题的简洁高效方案。
2025-12-19 10:31:30
177
原创 递归乘法(位操作)
摘要:本文介绍了一种使用位运算实现乘法的递归算法。通过俄罗斯农民乘法原理,将乘法转换为位移和加法操作:当B为奇数时返回A加上递归结果,否则直接递归。算法时间复杂度为O(logB),由于int为32位,最终为常数级O(1)。该方法避免了直接使用乘法运算符,通过位运算高效实现了乘法功能。
2025-12-19 10:22:04
180
原创 Linux----线程互斥与同步
摘要:本文探讨了多线程编程中的互斥与同步机制,重点分析了生产者-消费者模型。通过火车票抢购案例,展示了多线程并发访问共享资源导致的数据不一致问题,并引入互斥锁(pthread_mutex)和条件变量(pthread_cond)实现线程同步。文章详细讲解了互斥锁和条件变量的接口使用,并实现了一个基于阻塞队列(BlockingQueue)的生产者-消费者模型,解决了线程间的同步与互斥问题。最后,文章强调了使用while而非if判断条件的重要性,以避免伪唤醒问题,确保程序的正确性。
2025-12-18 22:02:27
711
原创 合并区间(二维vector使用,多维vector使用默认sort)
本文介绍了多维vector的排序规则和使用方法。在C++中,sort函数对多维数组采用字典序比较:对于二维vector,先比较第一元素,相同再比较第二元素;三维vector则逐层比较,依次比较每层的元素。这种排序方式恰好满足区间合并的需求,示例代码展示了如何利用sort对区间进行排序合并:先按左端点升序排列,相同则按右端点升序,再通过遍历合并重叠区间。总结指出,无论多少维度,排序都是逐层逐元素比较,遇到不同立即决定顺序,相同则继续比较下一位。
2025-12-17 21:00:06
185
原创 连续数组(哈希+前缀和)
摘要:该问题通过将0视为-1转化为寻找和为0的最长子数组。使用哈希表记录前缀和首次出现的位置,当相同前缀和再次出现时,计算子数组长度并更新最大值。初始化哈希表为{0:-1}处理边界情况,最终返回最长子数组长度。时间复杂度O(n),空间复杂度O(n)。
2025-12-17 20:38:07
203
原创 Linux----mmap
mmap 是 Linux 虚拟内存机制的核心接口。它不仅支撑了文件映射、高性能 I/O,也支撑了线程栈、动态内存分配和共享内存。
2025-12-14 13:29:31
642
原创 全排列问题(包含重复数字与不可包含重复数字)
本文介绍了两种排列问题的回溯解法:对于无重复元素的排列,使用标准回溯法,通过访问标记数组避免重复选择;对于含重复元素的排列,需先排序并添加约束条件,当当前元素与前一个相同且前一个未被使用时跳过,从而避免重复排列。两种方法都通过递归回溯生成所有排列,关键区别在于处理重复元素时的额外条件判断。
2025-12-13 21:15:20
313
原创 盛水最多的容器(滑动窗口 双指针)
本文提出了一种高效求解容器盛水最大面积问题的算法。通过双指针法(滑动窗口),将时间复杂度从O(N^2)优化到O(N)。算法初始设置左右指针于数组两端,计算当前面积后移动较小高度的指针,逐步缩小窗口范围。该贪心策略的正确性在于:移动较小指针能保证不会错过更大面积的可能。每次迭代都将问题规模减1,最终从所有可能的极值中找到最大值。文末提供了对应的C++实现代码,通过维护最大面积变量并在指针移动过程中不断更新该值来解决问题。
2025-12-13 20:24:59
220
原创 找到字符串中所有的字母异位词(固定大小窗口)与最小覆盖字串(不固定窗口大小)滑动指针
本文讨论了滑动窗口算法的两种应用场景。对于不固定窗口大小的问题,通过维护差值计数器和count变量实现O(N)时间复杂度,采用右扩左缩策略动态调整窗口。对于固定窗口大小问题,直接比较哈希表即可,使用memcmp快速判断匹配。两种方法都通过优化统计机制避免了暴力解法的高复杂度,显著提升了算法效率。
2025-12-09 22:20:44
314
原创 删除相邻数字的最大分数(打家劫舍)
摘要:本题类似"打家劫舍"问题,通过预处理将数组元素转换为sum数组(sum[i]表示值为i的元素总和)。使用动态规划求解,状态转移方程为dp[i] = max(dp[i-1], dp[i-2]+sum[i]),确保不选取相邻元素的情况下获得最大分数。最终结果存储在dp[10001]中。时间复杂度为O(n),空间复杂度为O(1)。
2025-12-08 19:12:05
124
原创 Linux----信号(产生、保存、处理)
本文介绍了Linux系统中的信号机制及其应用。信号是进程间异步通信的一种方式,属于软中断。文章详细讲解了信号的产生方式(如kill命令、系统调用、硬件异常等)、信号处理(默认动作、忽略和捕捉)以及信号保存机制(pending、block和handler)。通过示例代码展示了如何使用signal()和sigaction()函数捕捉信号,并分析了信号处理过程中用户态与内核态的切换。此外,文章还探讨了函数重入问题、volatile关键字的作用,以及利用SIGCHLD信号回收子进程资源的方法。最后比较了SIG_IG
2025-12-04 11:05:26
1229
原创 mari和shiny() (多状态dp数组)
本文介绍了一种解决字符串子序列计数问题的多状态线性动态规划方法。原始代码使用三个数组s、h、y分别统计字符's'、'sh'组合和'shy'组合的出现次数,通过遍历字符串并递推更新这三个数组。优化后的代码将空间复杂度从O(n)降至O(1),仅维护三个变量s、h、y,在遍历时动态更新它们的值。最终输出变量y的值即为字符串中"shy"子序列的总数。这种方法高效地解决了特定字符组合的计数问题,同时通过空间优化显著减少了内存使用。
2025-12-03 23:29:40
198
原创 删除公共字符(C++中迭代器会失效的情况)
本文总结了字符串处理中的三个关键点:1)使用getline而非cin读取整行字符串;2)string的erase操作会导致迭代器失效,需重新获取迭代器;3)find方法查找失败时返回npos。这些细节在解决"删除公共字符"问题时尤为重要。
2025-12-01 20:16:31
302
原创 买卖股票的最好时机
本文介绍两种股票买卖时机的算法。第一种方法通过遍历维护最大值,遇到更小值则更新起点继续迭代。第二种方法计算相邻价格差,只要后价高于前价就将差值累加求和,从而获得最大利润。两种方法都能有效处理不同价格波动情况,如123和2415等序列。
2025-12-01 19:54:57
152
原创 数组中的最长连续子序列
本文介绍了两种在C++中寻找数组最长连续子序列的方法。第一种利用set容器自动去重和排序的特性,时间复杂度为O(NlogN)。第二种方法通过sort排序后,配合unique函数去除相邻重复元素,再用erase清理无效数据,同样达到O(NlogN)的时间效率。文章详细解析了unique函数的工作原理:它通过读写指针移动保留首次出现的元素,需要配合sort和erase才能实现完全去重。两种方法都能有效解决问题,第二种在空间使用上更优。
2025-11-21 23:43:15
353
原创 拼三角(枚举)
本文介绍了通过暴力遍历法解决拼三角问题的思路。由于从六个数中选三个只有20种组合,计算量较小。关键判断条件是较小的两个边之和大于最大边,这是构成三角形的充分必要条件。作者特别指出在编写isvalid函数时容易出现的错误:若默认某边不是最大边会导致bug,强调正确判断的重要性。
2025-11-20 20:46:09
202
原创 Linux----进程通信(匿名管道,命名管道,共享内存)
本文详细介绍了进程间通信(IPC)的几种主要方法,包括管道、共享内存和System V IPC机制。重点分析了匿名管道和命名管道的工作原理、特性及实际应用,通过代码示例展示了进程池的实现。文章深入探讨了共享内存的创建、挂接和管理流程,并比较了不同IPC机制的优缺点。针对同步问题,提出了基于管道的解决方案。最后简要介绍了System V信号量和消息队列的管理机制,指出其逐渐被淘汰的原因。全文通过理论分析与实践案例相结合的方式,系统性地阐述了进程间通信的核心技术。
2025-11-20 09:49:27
978
原创 清理visited或不清理的情况
摘要: DFS/BFS中是否清理visited取决于其用途: 不清理:当visited表示节点永久访问(全局状态),如图遍历、连通分量统计、BFS最短路径、拓扑排序等,节点只需访问一次。 需清理:当visited用于保证路径合法性(局部状态),如单词搜索、N皇后、全排列等回溯问题,必须撤销标记以允许其他路径复用节点。 核心规律: 永久性访问(如岛屿计数)❌不清理; 临时路径限制(如回溯)✅需清理。 举例: 不清理:图BFS、岛屿DFS; 清理:单词搜索回溯时需重置visited。
2025-11-20 00:07:21
736
原创 腐烂的苹果(BFS)
摘要:该问题要求计算所有新鲜苹果被腐烂的最短时间。核心方法是多源BFS:初始将所有腐烂苹果(2)作为起点同时开始扩散,每分钟腐蚀相邻新鲜苹果(1)。关键步骤:1)将腐烂苹果全部入队;2)统计新鲜苹果数量;3)分层BFS,每层代表1分钟;4)若BFS后仍有新鲜苹果则返回-1,否则返回分钟数。注意初始时间设为-1,避免最后一轮无新鲜苹果时的错误计时。
2025-11-19 23:04:28
473
原创 大数加法(字符串和链表),大数乘法(字符串)
摘要:本文探讨了大数运算的实现方法。针对超过long long范围(约10^19)的大数(如10^1000量级),提出了基于字符串和链表的处理方案。字符串运算采用从右向左逐位相加并处理进位的方式,结果需逆序输出;链表运算则需要先转换存储结构,并注意内存管理以避免野指针问题。文章还详细分析了竖式乘法的数组模拟实现,包括结果位数的确定(n+m位)、乘积位置计算(res[i+j+1])和进位处理(res[i+j]),并通过123×45的实例演示了该算法的具体执行过程。
2025-11-19 22:32:42
360
原创 单词搜索(int a[][]与int**p的区别)
本文总结了使用DFS算法时的关键注意事项:1.正确标记visited数组,避免使用坐标标记;2.在递归完成后及时清理visited标记;3.特别注意二维数组和二级指针的内存布局差异,不能混用;4.建议将visited设为全局变量并使用memset初始化。重点分析了二维数组(连续内存)和动态分配的二级指针(非连续内存)在内存布局上的本质区别,强调它们不能相互替代的原因。这些技术要点对正确实现DFS算法和避免内存访问错误至关重要。
2025-11-17 23:23:06
506
原创 孩子们的游戏(圆圈中最后剩下的数)-约瑟夫环
动态规划法能在O(1)空间和O(N)时间内解决该问题,满足题目要求。相比模拟法(数组/链表)会占用更多空间,动态规划通过状态转移方程计算最优解,仅需常量额外空间。
2025-11-17 22:26:19
138
原创 游游的you
C++11支持通过初始化列表实现多元素比较,如min({a,b,c,d}),这比早期版本采用嵌套min函数的方式(如min(min(a,d),min(c,b)))更简洁高效。该特性简化了代码书写,提升了可读性。
2025-11-17 21:46:52
255
原创 dd爱框框
摘要:本文介绍了一种处理大规模数据(达10000000)时使用printf而非cin避免超时的方法。核心算法采用双指针滑动窗口技术,根据窗口和与目标值的关系调整指针移动:若和小于目标则右移右指针,大于则左移左指针,并同步记录最小长度和对应下标。该方法是解决类似问题的经典思路。
2025-11-16 23:03:04
204
原创 简写单词
本文探讨了两种处理字符串并输出首字母缩写的编程方法。第一种方法使用getline获取整行输入,手动识别空格后的字母,并将小写字母转换为大写。第二种更简洁的方法直接在每次输入时获取以空格分隔的字符串,仅处理每个字符串的首字母并进行大写转换。两种方法都利用了ASCII码中大小写字母相差32的特性(大写=小写-32),但第二种方法更为高效,利用了输入时自然的分隔特性,避免了复杂的空格处理逻辑。
2025-11-14 18:42:46
257
原创 数组中两个字符串的最小距离
文章摘要:题目要求在给定字符串中找到两个指定字符的最短距离(如"acdba"中a和b的最短距离为1)。采用双指针法优化效率,避免暴力遍历:维护两个指针分别追踪最近的str1和str2出现位置,通过比较位置差更新最小值。若遍历结束后min未更新,则说明目标字符缺失或未同时出现。该方法实现了O(n)时间复杂度且无需额外空间,兼顾效率与准确性。
2025-11-14 18:31:30
173
原创 除2 !
本文探讨了使用set和multiset处理偶数的排序和删除问题。作者发现set默认排序无法满足需求,改用multiset并自定义排序规则实现偶数从大到小排列。在删除操作中,发现erase(value)会删除全部重复值,改为erase(begin())逐个删除最大偶数。最后提出priority_queue作为更优方案,其pop和top操作比multiset更简便,能高效获取和删除最大元素。整个过程展示了不同数据结构在处理有序元素时的特性差异和优化思路。
2025-11-14 16:06:19
150
原创 点击消除
文章摘要:该文讨论了使用栈结构解决"点击消除"类问题的技巧。要点包括:1)遇到相邻相同元素删除的问题可考虑栈结构;2)使用栈顶元素前必须判空,否则会导致段错误;3)此类问题难度虽小,但需注意栈的基本操作规范。该建议适用于牛客网编程题库中的类似题目。
2025-11-13 20:12:06
268
原创 牛牛的快递 数据类型转换
题目涉及不同类型数据的比较运算规则,尤其int与double比较时会自动提升int为double类型。同时介绍了使用ceil()函数对double向上取整的方法,但需注意取整结果仍为double类型,需要显式类型转换。该问题考察了数据类型转换和数学函数的使用细节。
2025-11-12 16:33:17
174
原创 非回文子字符串
摘要:针对长度为10^7的字符串寻找最长非回文子串,传统O(N^2)的回文检测方法不适用。关键思路:若原串非回文直接返回其长度;若为回文则最长非回文子串长度为n-1,全相同字符时返回0。该算法避免了高复杂度检测,保证线性时间复杂度。
2025-11-12 16:25:52
244
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅