自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(176)
  • 收藏
  • 关注

原创 HTTP/1.1 该如何优化

摘要:本文提出三种优化HTTP/1.1协议的方法:1)利用缓存技术避免重复请求,通过304响应验证缓存有效性;2)减少请求次数,包括代理重定向、资源合并和延迟加载;3)压缩响应资源提升传输效率。同时指出这些优化存在局限性,为后续HTTP/2/3的出现埋下伏笔。(98字)

2025-08-08 07:55:43 89

原创 cookie和session之间区别

摘要:Cookie和Session是两种用户状态跟踪技术,主要区别在于:Cookie存储在客户端浏览器(4KB限制),Session存储在服务器端(容量更大);Session安全性更高,Cookie易受攻击;Cookie可长期保存,Session随浏览器关闭失效;Cookie自动传输但影响性能,Session需标识符查询增加服务器负载;Cookie仅支持字符串,Session可存储复杂数据类型。

2025-08-07 17:43:04 285

原创 进程间有哪些通信机制

摘要: 进程间通信(IPC)机制主要包括: 管道:匿名管道(父子进程间单向通信)和命名管道(无关进程间通信); 消息队列:内核存储的格式化消息链表,支持多进程访问; 共享内存:高效共享物理内存区域,需配合信号量实现同步; 信号量:控制资源访问的计数器,保证互斥与同步; 信号:异步事件通知机制(如SIGKILL不可忽略); Socket:支持网络及本地进程通信(TCP/UDP/本地协议); 文件映射:将文件映射至进程地址空间实现数据共享。 其中共享内存速度最快,信号和信号量功能不同,Socket可跨主机通信。

2025-08-07 17:17:43 304

原创 算法思想总结:位运算

【摘要】本文总结了LeetCode第191题"位1的个数"的位运算解法。通过n&(n-1)操作可以消除二进制数最低位的1,每次循环计数直到n变为0。举例说明11(1011)经过三次操作后得到结果3。代码实现简洁高效,时间复杂度O(k),k为1的个数。该解法展示了位运算在算法问题中的巧妙应用。

2025-08-07 10:22:07 133

原创 进程和线程的区别

进程和线程的核心区别在于:进程是资源分配的基本单位,拥有独立内存空间;线程是CPU调度的基本单位,共享进程资源。进程创建开销大(需分配内存、初始化PCB),切换耗时约10000-100000时钟周期;线程创建开销小,切换仅需约1000时钟周期。进程崩溃不会影响其他进程,线程崩溃会导致整个进程终止。进程间通信需系统调用(如管道、共享内存),线程可直接共享变量。进程适合分布式系统,线程适合共享内存并发,但线程同步效率更高(如互斥量)。Linux中线程作为轻量级进程(LWP)由CFS调度器统一管理。

2025-08-07 09:43:30 824

原创 Socket与IO多路复用的联系

摘要: 传统Socket的阻塞式IO模型每个连接独占线程,高并发时资源消耗大。多进程/线程虽能处理多连接,但存在上下文切换和内存开销问题。IO多路复用技术通过单线程监控多连接解决此问题: select支持多路监听但受限于1024连接,需O(n)遍历和频繁数据拷贝; poll取消连接数限制,仍存在遍历和拷贝开销; epoll采用事件驱动和共享内存,实现O(1)复杂度,支持百万级并发,成为Linux下高性能服务器的首选。三者中epoll综合性能最优,但跨平台性较弱。选择需权衡场景需求(连接数、平台、性能)。

2025-08-03 09:37:36 446

原创 全局变量与局部变量的对比

全局变量与局部变量在作用域、生命周期和内存分配上存在显著差异。全局变量存储在数据段,程序启动时分配,结束时释放;局部变量存储在栈或堆上,进入作用域时创建,离开时销毁。编译器通过内存位置区分二者,全局变量默认可全局访问,局部变量仅限于声明块内。静态局部变量具有全局生命周期但保持局部作用域。多线程环境下,全局变量需同步保护,而自动局部变量天然线程安全。内存优化方面,局部变量更易被优化到寄存器,提升缓存效率。

2025-07-19 11:40:25 895

原创 struct和class的区别

【摘要】C++中struct与class的区别主要在于默认访问权限:struct默认public,class默认private。两者在功能上完全等价,都能实现封装、继承和多态。选择使用时,struct通常用于数据聚合和C兼容场景,class则更适合复杂对象封装。这一设计体现了C++对C语言的兼容与面向对象特性的融合。在实际开发中,应根据语义需求选择,用struct明确表示简单数据结构,用class强调对象行为封装。理解这一区别有助于编写更具表达力的代码。

2025-07-19 07:39:46 738

原创 sizeof和strlen的区别

本文对比C/C++中strlen和sizeof的核心区别:strlen是计算字符串长度的函数,运行时遍历字符直到遇到'\0',返回字符数;sizeof是编译时确定内存大小的运算符,返回字节数。关键差异在于:strlen仅适用于字符串,不包含结束符,有运行时开销;sizeof适用于任何类型,包含整个存储空间,无执行开销。文中通过字符数组、指针等示例展示二者的不同输出,并指出常见面试陷阱。实际应用中,strlen用于字符串操作,sizeof用于内存分配和数组计算。正确理解二者的本质区别对C/C++编程至关重要。

2025-07-18 23:20:15 676

原创 LeetCode - 1668. 最大重复子字符串

当 word 的长度小于或等于 sequence 的长度时(正常情况),m-n 会是负数或零,导致循环一次都不执行。正确的条件应该是 i <= m-n(如果 m≥n)或者更准确地说是 i <= m-n(当 m≥n 时)。这里的条件是 i < m-n,其中 m 是 sequence 的长度,n 是 word 的长度。j+n < m 检查是否超出序列边界,但实际上应该是 j+n <= m。滑动窗口法的核心是从序列的每个可能的起始位置开始,尝试找出最多连续重复的word子串。

2025-07-10 11:18:06 290

原创 C++ - 匿名对象

C++中的匿名对象是未被命名的临时对象,通常用于单次操作或函数调用。其特点是生命周期仅限当前语句,执行完即被销毁。匿名对象既可以是类类型(如自定义类),也可以是内置类型(如int、double)。通过const引用可延长其生命周期。相比具名对象,匿名对象适合单次调用场景,但无法重复使用。使用时需注意权限问题,如临时对象的常属性可能导致引用权限放大。匿名对象在简化代码和实现隐式转换方面具有优势,但需根据场景权衡使用。

2025-07-01 08:12:52 886

原创 RPC-Client模块

文章摘要: 本文介绍了四个RPC客户端接口的设计思路:RegistryClient用于服务注册,DiscoveryClient用于服务发现,RpcClient用于远程调用,TopicClient用于主题管理。所有客户端采用统一架构,通过Dispatcher实现消息路由,支持多级回调机制:一级message_cb处理网络消息,二级回调(如rsp_cb、req_cb)处理特定消息类型。RegistryClient封装服务注册逻辑,DiscoveryClient实现服务发现并支持下线通知,RpcClient提供同

2025-06-30 21:17:48 669

原创 RPC - 框架设计

本项目实现了一个分布式RPC系统,包含三大核心功能:1. RPC远程调用服务,支持同步/异步/回调三种调用方式;2.服务注册与发现机制,通过注册中心实现服务动态管理;3.基于主题的发布订阅功能。系统采用模块化设计,服务端包含网络通信、协议解析、消息分发等模块,客户端实现请求管理、服务发现等功能。使用Muduo网络库处理底层通信,采用LV格式解决粘包问题,通过JSON进行序列化。系统支持分布式部署,可实现负载均衡和服务高可用,通过注册中心协调多个服务节点,确保系统扩展性和稳定性。

2025-06-23 23:37:01 894

原创 RPC-Registry客户端模块

文章摘要: 本文详细解析了分布式系统中的三个核心组件:registryMethod函数、MethodHost类和Discoverer类。registryMethod用于服务提供者向注册中心注册服务(如披萨店注册披萨服务),建立服务名称到提供者地址的映射。MethodHost类管理服务地址,支持服务的动态增删(如麻辣烫店铺上下线)和负载均衡。Discoverer类实现服务发现功能,通过缓存和服务状态变更通知(如奶茶店上新/下架)来动态维护可用服务列表。三者配合实现了分布式系统中的服务注册、发现和管理机制,类比

2025-06-21 11:32:11 1136

原创 RPC-Registry服务端模块

服务注册主要是实现分布式的系统,让系统更加的健壮,一个节点主机将自己所能提供的服务,在注册中心进行登记。

2025-06-21 00:01:02 858

原创 RPC - Response模块

Requestor 类是一个请求-响应管理器,负责发送请求并处理响应,支持三种交互模式:同步、异步和回调。它跟踪所有发出的请求,当响应到达时将其匹配到对应的请求并进行处理。

2025-06-19 10:25:26 1150

原创 Rpc - RpcCaller 模块

即可那么该如何组织请求呢,使用工厂模式创建 RpcRequest 对象,设置唯一标识符 (UUID),设置消息类型 (REQ_RPC),设置方法名和参数。

2025-06-19 10:17:59 618

原创 LeetCode - LCR 173. 点名

摘要:该文讨论了LeetCode题目LCR173(点名)的二分查找解法。初始代码在处理缺失最后一个数字的情况时存在缺陷,当数组完整时会导致错误。正确解法应在循环结束后进行额外检查:如果当前元素值等于其索引,说明缺失的是最后一个数字(n-1),此时应返回right+1;否则返回right。改进后的代码通过增加边界条件判断,解决了原方案的不足,保证了在所有情况下都能正确识别缺失的数字。(149字)

2025-06-14 16:11:10 265

原创 LeetCode - 153. 寻找旋转排序数组中的最小值

摘要:文章详细解析了力扣153题"寻找旋转排序数组中的最小值"的二分查找解法。旋转排序数组被分成两个有序子数组,最小值位于第二个子数组的首位。算法通过比较中间元素与右边界值来确定搜索区间:当nums[mid]>nums[right]时最小值在右半部分,否则在左半部分。以数组[4,5,6,7,0,1,2]为例,展示了二分查找的具体步骤。文章还分析了常见的错误写法(如使用独立if语句、错误的终止条件等),并给出了正确的代码实现。该解法时间复杂度为O(logn),空间复杂度为O(1)。

2025-06-14 15:52:49 1006

原创 LeetCode - 852. 山脉数组的峰顶索引

摘要:本文介绍LeetCode 852题"山脉数组的峰顶索引"的二分查找解法。通过比较中间元素与其右侧元素的大小来判断当前处于上坡还是下坡:若arr[mid] < arr[mid+1]则向右查找,反之则向左查找或定位当前位置。该方法时间复杂度为O(logn),空间复杂度O(1)。最终返回left与right重合时的索引即为峰顶位置。代码实现简洁高效,符合题目要求。

2025-06-14 15:12:40 369

原创 LeetCode - 35. 搜索插入位置

文章摘要:本文解析了力扣题35"搜索插入位置"的二分查找解法,重点指出常见错误是循环结束后返回right而非left。关键点在于二分循环终止时:left指向第一个≥target的位置,right指向最后一个<target的位置。因此对于插入位置问题,应返回left。正确代码使用标准二分模板,通过维护左右指针缩小范围,最终返回left作为插入位置索引。

2025-06-14 14:55:19 242

原创 LeetCode - 69. x 的平方根

摘要:本文介绍了使用二分查找算法计算整数平方根的正确方法。关键点包括:初始化搜索范围为[1,x],通过比较mid与x/mid避免整数溢出,正确返回right值作为结果。针对常见错误写法进行分析,指出其初始化和返回值问题,以及整数溢出风险。最终给出正确解法,确保在所有情况下都能准确计算平方根的整数部分,包括处理x=0的特殊情况。该方法通过优化比较方式和边界处理,保证了算法的高效性和正确性。

2025-06-14 14:40:58 366

原创 LeetCode - 34. 在排序数组中查找元素的第一个和最后一个位置

这篇文章介绍了在排序数组中查找目标值起始和结束位置的二分查找算法。主要内容包括: 查找左边界时使用向下取整的中值计算,通过right=mid保留可能的左边界 查找右边界时使用向上取整的中值计算,通过left=mid保留可能的右边界 关键点说明:循环条件使用left<right避免死循环,查找左右边界时采用不同的中值计算方式 常见错误分析:展示了可能导致边界遗漏或死循环的错误写法 算法正确性验证:以[5,7,7,8,8,10]为例,详细演示了查找target=8的执行过程 比较了不同中值计算方式对算法性

2025-06-14 11:44:17 1478

原创 LeetCode - 704. 二分查找

本文介绍了二分查找算法的实现思路。算法通过初始化左右指针,在[left,right]区间内循环查找目标值。每次迭代计算中间索引,将目标值与中间元素比较,根据结果调整搜索区间。关键点包括:使用left<=right确保全面检查、正确的区间更新方式以及避免整数溢出。文章以实例演示搜索过程,分析时间复杂度为O(logn),空间复杂度为O(1)。最后指出了常见错误写法:错误的比较对象、条件判断结构和循环条件设置,并给出了正确代码实现。

2025-06-14 09:12:21 625

原创 LeetCode - 224. 基本计算器

摘要:本文介绍了力扣题目224"基本计算器"的解法,使用双栈处理包含加减法和括号的表达式。算法核心是数字栈和运算符栈的配合,通过优先级规则处理运算顺序,特别用栈处理括号层级。文中详细演示了表达式"1+(4+5+2)-3"的计算流程,并对比了正确与错误的代码实现,最终给出正确解法:使用单栈保存中间结果和符号,处理加减号时更新结果,遇到括号时保存当前状态,处理完括号内运算后再恢复之前状态。

2025-06-14 08:14:19 517

原创 LeetCode - 76. 最小覆盖子串

摘要: 本文详细介绍了力扣76题「最小覆盖子串」的滑动窗口解法。通过预处理阶段建立哈希表记录目标字符的需求量,使用双指针扩展和收缩窗口,确保窗口内包含所有目标字符且出现次数满足要求。关键在于维护valid变量验证当前窗口的有效性,并在收缩时更新最小窗口信息。时间复杂度为O(n),空间复杂度为O(字符集大小)。以示例s="ADOBECODEBANC"和t="ABC"逐步演示窗口移动过程,最终返回最小子串"BANC"。文章还指出常见错误(如未初始化和条

2025-06-13 19:46:47 757

原创 LeetCode - 387. 字符串中的第一个唯一字符

【摘要】本文解析了力扣387题"字符串中的第一个唯一字符"的解法。正确解法使用哈希表(unordered_map)统计字符频率,先遍历字符串记录每个字符出现次数,再遍历查找第一个频率为1的字符。常见错误包括:1)误用vector<char,int>而非哈希表;2)vector无法用字符作为下标;3)遍历对象错误。正确代码应使用unordered_map<char,int>存储频率,并两次遍历字符串,时间复杂度O(n)。示例代码展示了如何正确实现这一算法。

2025-06-13 16:38:22 418

原创 LeetCode - 904. 水果成篮

【摘要】题目"水果成篮"要求在整数数组中找到最长的连续子数组,其中最多包含两种不同的数字(水果种类)。采用滑动窗口法,用双指针标记窗口边界,哈希表统计水果种类。当种类超过2时收缩左边界,直至窗口合法。常见错误是未及时删除哈希表中计数为0的水果种类,导致统计错误。正确解法需在减少计数后检查并删除零值项,同时移动左指针。时间复杂度为O(n),空间复杂度O(1)。示例代码展示了正确处理逻辑,确保窗口内始终不超过2种水果,并动态更新最大长度。

2025-06-13 15:43:01 425

原创 LeetCode - 1047. 删除字符串中的所有相邻重复项

即使你检查了输入字符串 s 是否为空,但在第一次迭代时,栈 st 仍然是空的。当你尝试访问 st.top() 时,如果栈为空,这会导致未定义行为。这是一个典型的栈应用问题。我们可以用栈来跟踪字符,当遇到与栈顶相同的字符时,就将栈顶元素弹出(相当于删除这对相邻重复项)。从栈中弹出元素的顺序与它们在原始字符串中的顺序相反,所以最终结果需要反转。将栈中元素从底到顶组成字符串:"ca"最终栈中的字符:['c', 'a']

2025-06-11 11:17:09 355

原创 LeetCode - 136. 只出现一次的数字

因此,当数组中除了一个数出现一次外,其他数都出现两次时,将所有数异或在一起,相同的数会两两抵消(变为0),最终只剩下那个出现一次的数。这个解法的时间复杂度是O(n),空间复杂度是O(1),完美满足题目要求的线性时间和常量额外空间。

2025-06-11 10:36:33 367

原创 LeetCode - 228. 汇总区间

原因:当处理完一个区间后,left 需要移动到下一个区间的起点,即当前区间的终点的下一个位置 (right + 1)。原因:在 for 循环中 int right = 0 已定义了循环变量,但内部又使用 right = left 覆盖了这个值,这会导致循环异常,因为循环变量被意外修改。原因:当 right 是数组的最后一个元素时,right+1 将超出数组边界,导致访问无效内存,这是未定义行为,可能导致程序崩溃。result 是 vector<int> 类型,但函数返回类型是 vector<string>

2025-06-11 09:39:52 546

原创 LeetCode - 394. 字符串解码

该算法能够处理嵌套的编码,例如"2[a2[bc]]"这样的情况。时间复杂度为O(n),其中n是输入字符串的长度。一个存储重复次数,一个存储字符串。最终返回处理后的字符串。

2025-06-10 23:26:18 452

原创 LeetCode - 19. 删除链表的倒数第 N 个结点

在 while 循环结束后,curr 已经是 nullptr(因为循环条件是 while(curr))。这行代码实际上是将 prev->next 设置为 nullptr,这意味着它会删除从 prev->next 开始的所有节点,而不仅仅是删除倒数第 n 个节点。这段代码让 curr 指针只前进了 n 步。如果您想删除倒数第 n 个节点,并且 prev 需要指向要删除节点的前一个节点,那么 curr 应该前进 n+1 步。

2025-06-10 15:19:12 446

原创 LeetCode - LCR 136. 删除链表的节点

在循环中,您先移动了prev和curr指针,然后才检查值,这会导致指针错位。正确的做法是先检查值,然后根据情况决定是否移动指针。在while循环中,您先移动了curr指针,然后访问curr->val,如果curr变成nullptr,这会导致空指针访问。您将prev直接设为prev->next,这样prev和curr就指向了同一个节点,无法正确删除节点。如果头节点的值等于val,您的代码不会删除它。

2025-06-10 14:35:16 293

原创 LeetCode - 557. 反转字符串中的单词 III

如果字符串不以空格结尾,最后一个单词不会被处理。

2025-06-10 12:34:47 501

原创 LeetCode - 2. 两数相加

原代码没有移动结果链表的指针,导致每次新节点都会覆盖前一个节点,最终结果链表只有一个节点。修改后确保每次添加新节点后,指针移动到最新节点,保持链表的正确结构。原循环条件只在两个链表都有节点时执行,会忽略较长链表的剩余部分和最后可能存在的进位。修改后的条件确保处理所有情况:任一链表还有节点或存在进位时都会继续计算。while(cur1 && cur2)只处理两个链表长度相同的部分,忽略了较长链表的剩余部分和可能的进位。同时遍历两个链表,只要有一个链表还有节点或者有进位,就继续计算。函数末尾缺少返回语句。

2025-06-10 09:50:10 1011

原创 LeetCode - 206. 反转链表

递归反转链表的核心思想是:先反转链表的后续部分,然后再处理当前节点。这种"从后往前"的处理方式利用了递归的特性。没有判断!head->next在递归过程中,当 head 是链表的最后一个节点时,head->next 是 nullptr执行 head->next->next = head 会导致解引用空指针,造成运行时错误

2025-06-10 00:17:35 340

原创 LeetCode - 199. 二叉树的右视图

DFS访问顺序(先右后左)是:1 -> 3 -> 6 -> 2 -> 5 -> 4。右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。最终result=[1,3,6],正好是树的右视图。如果当前节为空,直接返回检查当前深度是否等于结果数组的长度如果是,说明这是当前深度第一个被访问的节点,将其值加入结果数组如果不是,说明该深度已经有节点被加入结果,不做操作先递归访问右子树(深度+1),再递归访问左子树(深度+1)

2025-06-09 23:05:05 1053

原创 LeetCode - 260. 只出现一次的数字 III

异或(XOR)是一种基本的位运算操作,符号通常表示为 ^。它有以下特点:异或是一种二元运算,对两个位(bit)进行操作当两个位相同时,结果为0当两个位不同时,结果为10 ^ 0 = 00 ^ 1 = 11 ^ 0 = 11 ^ 1 = 0任何数与0异或等于其本身:a ^ 0 = a任何数与自身异或等于0:a ^ a = 0异或满足交换律:a ^ b = b ^ a异或满足结合律:(a ^ b) ^ c = a ^ (b ^ c)

2025-06-09 22:31:45 1011

原创 LeetCode - 3. 无重复字符的最长子串

维护一个"窗口",这个窗口内的所有字符都是不重复的。当遇到重复字符时,调整窗口左边界,确保窗口内无重复字符。滑动窗口是处理子串/子数组问题的常用技巧,结合哈希表可以高效解决此问题。步骤6:右指针移动到第二个'c'步骤7:右指针移动到第三个'b'步骤4:右指针移动到第二个'a'步骤5:右指针移动到第二个'b'步骤8:右指针移动到第四个'b'最终结果:最大无重复子串长度为3。步骤1:右指针移动到'a'步骤2:右指针移动到'b'步骤3:右指针移动到'c'

2025-06-09 18:03:50 387

耗时一个月,15万字+的Linux思维导图!!!

耗时一个月,15万字+的Linux思维导图!!!

2025-05-31

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除