- 博客(78)
- 收藏
- 关注
原创 普通数组-----除了自身以外数组的乘积
本文介绍了一种高效计算数组中除自身外所有元素乘积的算法。题目要求在O(n)时间复杂度和不使用除法的情况下解决问题。算法采用前缀乘积和后缀乘积的思路:先正向遍历计算每个元素的前缀乘积,再反向遍历计算后缀乘积,最后将两者相乘得到结果。初始实现使用两个辅助数组,空间复杂度为O(n)。优化版本直接在结果数组上计算前缀乘积,并用变量动态维护后缀乘积,将空间复杂度降至O(1)。两种方法都满足时间复杂度要求,后者更节省空间。
2026-02-08 22:49:01
240
3
原创 Linux22 文件系统
本文系统介绍了文件系统的底层原理。首先阐述了硬盘的物理结构(CHS定位)和逻辑结构(LBA地址转换),解释了数据存取的基本单位是512字节的扇区。然后详细解析了ext2文件系统的组织方式:将分区划分为多个Block Group,每个包含超级块、块组描述符、inode表、数据块等结构。重点分析了inode与数据块的映射关系(12个直接指针+3级间接指针),以及目录作为特殊文件的存储机制(文件名与inode的映射)。最后对比了软硬链接的实现差异:软链接是独立文件存储路径,硬链接共享inode。文章通过分层递进的
2026-02-08 22:48:07
1071
2
原创 普通数组----轮转数组
本文介绍了三种解决数组轮转问题的方法:1. 额外数组法(O(n)空间)直接存储轮转结果;2. 三次反转法(最优解,O(1)空间)通过整体和局部反转实现原地操作;3. 环状替换法(O(1)空间)以环状方式交换元素位置。三种方法时间复杂度均为O(n),但空间复杂度不同,其中三次反转法在时间和空间上均为最优,推荐作为首选解法。
2026-02-07 23:02:23
437
7
原创 Linux 库
本文介绍了Linux系统中静态库的生成与使用方法。静态库(.a文件)是预先编译好的二进制代码集合,编译时会被链接到可执行文件中。文章详细演示了使用gcc编译源文件生成目标文件,通过ar命令打包成静态库的过程,并说明了如何通过-l和-L选项指定库名和搜索路径。针对多文件场景,还介绍了将头文件和静态库打包成tgz压缩包的分发方式。静态库的使用能提高代码复用性,但会增加可执行文件体积。文中包含具体命令行操作示例,帮助开发者掌握静态库的创建与集成方法。
2026-02-07 23:01:39
403
3
原创 普通数组----合并区间
摘要 本文介绍了一种合并重叠区间的高效算法。首先对区间数组按左端点排序,然后遍历处理:若当前区间与结果数组中最后一个区间无重叠则直接加入,否则合并右端点。算法时间复杂度为O(nlogn)(主要来自排序),空间复杂度为O(n)。关键点在于正确判断重叠条件和合理更新右边界。示例展示了如何将[[1,3],[2,6]]合并为[1,6]等典型情况。
2026-02-06 22:59:59
445
5
原创 Linux20 : IO
本文主要介绍了Linux系统中的文件I/O操作相关内容。首先从狭义和广义角度理解文件概念,指出文件操作本质是进程通过系统调用对磁盘文件进行的输入输出操作。接着详细讲解了系统级文件I/O接口,包括open、write、read、close等函数的使用方法,并通过示例代码演示了文件创建、写入、追加写入和读取等操作。重点分析了文件描述符(fd)的分配机制,说明Linux进程默认打开的三个标准文件描述符(0-标准输入、1-标准输出、2-标准错误)。文章还深入探讨了重定向的实现原理,介绍了dup2系统调用的使用,并展
2026-02-06 22:59:06
860
1
原创 普通数组----最大子数组和
本文介绍了LeetCode 53题"最大子数组和"的高效解法。通过前缀和与最小前缀和的概念,将问题转化为寻找最大差值。核心思路是维护当前前缀和、最小前缀和和全局最大值三个变量,在一次遍历中完成计算。该方法时间复杂度O(n),空间复杂度O(1),与Kadane算法效率相当但思路更数学化。文中提供了C++实现代码、示例验证和复杂度分析,并对比了不同解法特点,适用于面试准备和算法学习。
2026-02-05 22:58:49
824
15
原创 21:重谈重定义理解一切皆“文件“及缓存区
本文探讨了Linux系统中的I/O重定向、缓冲机制和文件操作原理。首先介绍了标准输出(stdout)和标准错误(stderr)的区别,演示了如何通过重定向将不同输出流分离到不同文件。其次解释了"一切皆文件"的Linux设计理念,包括文件描述符和内核文件结构。重点分析了三种缓冲区类型:全缓冲、行缓冲和无缓冲,通过代码示例展示了缓冲区在不同场景下的表现差异。最后实现了一个简化的文件I/O库,模拟了标准库的缓冲机制。文章深入浅出地阐述了Linux I/O系统的工作原理,揭示了系统调用和用户空间
2026-02-05 22:54:40
1176
19
原创 滑动窗口----最小子串
本文介绍了使用滑动窗口和哈希计数解决字符串最小覆盖子串问题的方法。通过维护一个动态窗口和字符需求哈希表,算法能够高效地找到包含目标字符串所有字符的最短子串。文章详细解析了代码实现步骤,包括初始化字符计数、扩展窗口、收缩窗口以及结果返回等关键环节,并分析了算法的时间复杂度为O(m+n),空间复杂度为O(1)的优异性能。该解法巧妙结合了滑动窗口的高效性和哈希表的精确计数特点,是处理字符串子串匹配问题的经典范例。
2026-02-04 23:04:51
321
3
原创 Linux19 实现shell基本功能
本文详细介绍了如何实现一个简单的Shell程序。首先分析了Shell的基本工作原理,包括获取命令行、解析命令、创建子进程和执行命令等步骤。然后通过代码示例展示了如何获取用户名、主机名等环境信息并格式化输出命令行提示符。重点讲解了使用strtok分割命令参数、通过fork和execvp执行外部命令的方法,并指出内建命令(如cd)需要特殊处理的原因——子进程无法改变父进程的工作目录。最后通过主循环实现了交互式Shell的基本功能。文章采用模块化设计思路,将各个功能封装为独立函数,便于维护和扩展。
2026-02-04 23:02:51
1306
16
原创 滑动窗口------滑动窗口最大值
本文介绍了一种使用单调队列高效解决滑动窗口最大值问题的方法。通过维护一个存储数组下标的双端队列,保证队列中的元素对应值单调递减,使得队首始终是当前窗口最大值。算法包含三个关键步骤:维护队列单调性、移除窗口外元素和记录窗口最大值。相比暴力解法的O(nk)时间复杂度,该算法将复杂度优化至O(n),空间复杂度为O(k)。代码实现简洁高效,适用于大规模数据处理。
2026-02-03 23:02:40
286
4
原创 Linux 18 进程控制
本文主要介绍了Linux进程管理的几个关键概念:1. 进程创建:详细讲解了fork系统调用的实现机制,包括写时拷贝技术及其优势(减少创建时间和内存浪费),以及fork失败的原因。2. 进程终止:分析了进程退出的三种场景(正常/异常结束、结果正确/错误),比较了exit和_exit的区别,指出缓冲区存在于库而非操作系统。3. 进程等待:阐述了父进程通过wait/waitpid回收子进程资源的必要性,区分了阻塞和非阻塞等待方式,并用生活案例形象说明其差异。4. 进程替换:介绍了exec函数族的功能和6种变体(e
2026-02-03 23:00:26
1257
13
原创 Linux 16 环境变量
摘要:本文系统讲解了Linux环境变量的核心概念与实战应用。环境变量作为"隐形的配置管家",通过键值对形式为程序提供全局参数,具有父子进程继承特性。文章详细介绍了PATH、HOME等常用变量,以及查看、设置、删除变量的命令操作;通过C代码示例演示了getenv/setenv等编程接口的使用;重点解析了环境变量的继承性原理,并给出让自定义程序免输入路径运行的实用技巧。最后总结了环境变量统一运行环境、简化配置传递的核心价值,帮助读者全面掌握这一Linux系统的重要机制。(149字)
2026-02-02 23:00:44
1823
6
原创 子串-----和为 K 的子数组
本文介绍了一种高效解决"和为k的子数组个数"问题的方法。通过前缀和与哈希表结合,将时间复杂度从暴力解法的O(n²)优化到O(n)。具体实现:1) 计算前缀和;2) 用哈希表记录各前缀和出现次数;3) 查询满足preSum[i]-k的前缀和数量。关键技巧是初始化hash[0]=1以处理从数组起始开始的子数组情况。该方法有效处理了包含负数的情况,适用于大规模数据。
2026-02-02 22:59:52
342
2
原创 滑动窗口-----找到所有字母异位词
本文介绍了一种使用滑动窗口算法在字符串s中查找所有p的字母异位词子串的方法。通过维护一个26位的字符计数数组,先统计p的字符频率,然后在遍历s时动态调整窗口边界:右指针移动时减少字符计数,当计数为负时移动左指针收缩窗口。当窗口长度等于p的长度时,记录有效起始索引。该算法时间复杂度为O(n+m),空间复杂度O(1),是解决异位词子串匹配问题的高效方案。
2026-02-01 23:01:42
869
3
原创 Linux 17 程序地址空间
本文探讨了Linux系统中的虚拟内存机制。通过实验验证,发现父子进程可以共享相同的虚拟地址但存储不同值,说明程序访问的是虚拟地址而非物理地址。文章详细解析了虚拟地址空间的工作原理,包括页表映射机制、mm_struct结构体对进程地址空间的管理方式,以及虚拟内存如何实现内存隔离和保护。同时阐述了虚拟内存的优势:将物理内存的"无序"分布转化为连续的虚拟空间,并通过权限控制保护内存安全。最后解答了几个相关问题,包括进程创建顺序、进程挂起机制,以及堆区内存管理方式。
2026-02-01 23:00:43
740
10
原创 滑动窗口----滑动窗口最大值
本文介绍了使用单调队列解决滑动窗口最大值问题的高效算法。通过维护一个双端队列来存储单调递减的元素下标,确保队首始终是当前窗口最大值。算法步骤如下:1)新元素入队时移除队尾较小元素;2)检查并移除超出窗口范围的队首元素;3)窗口形成时记录队首元素作为最大值。该方案时间复杂度为O(n),每个元素仅入队出队一次;空间复杂度O(k)。示例验证表明算法正确输出[3,3,5,5,6,7],与预期结果一致。
2026-01-31 22:33:15
431
4
原创 Linux15 进程二
本文摘要:介绍了Linux进程优先级管理机制。主要内容包括:1)进程优先级(PRI)和nice值(NI)的概念,PRI越小优先级越高,NI用于修正PRI值,范围-20到19;2)进程调度相关概念如竞争性、并行、并发等;3)进程切换的上下文切换机制;4)Linux 2.6内核的O(1)调度算法,采用哈希桶结构、位图和活跃/过期进程队列来高效管理140个优先级队列,并通过双队列机制解决进程饥饿问题。该调度系统通过精巧设计实现了高效公平的进程调度。
2026-01-31 22:32:16
642
2
原创 Linxu14 进程一
本文介绍了Linux进程管理的基本概念。进程由内核数据结构(task_struct)和程序代码数据组成,OS通过链表管理进程。task_struct包含进程标识符、状态、优先级等关键信息。文章详细解析了进程状态(运行、阻塞、挂起等)及其转换机制,并介绍了通过/proc系统文件和top/ps工具查看进程的方法。重点讲解了fork系统调用创建进程的过程,包括父子进程关系和写时复制机制。最后,通过Linux内核源代码分析了各种进程状态定义及其实际含义,为深入理解进程管理奠定了基础。
2026-01-30 21:58:52
1495
6
原创 子串----和为K的子数组
本文探讨了求解数组中和为k的连续子数组个数的问题。首先介绍了暴力解法(双重循环枚举子数组),指出其O(n²)时间复杂度不适用于大数据量。随后提出优化方案:利用前缀和与哈希表,将问题转化为统计pre_sum[i]-k的出现次数。关键点在于初始化hash[0]=1以处理从数组起始位置开始的子数组。该方法将时间复杂度优化至O(n),空间复杂度O(n)。文章包含C++代码实现,适用于包含负数和零的数组,确保统计的是连续子数组。
2026-01-30 21:58:21
382
4
原创 滑动窗口-----找到所有字母异位词
本文介绍了一种使用滑动窗口算法在字符串s中查找所有p的字母异位词子串的方法。通过维护一个动态窗口,统计字符出现次数来快速匹配。算法初始化字符计数数组后,右指针遍历字符串,调整窗口边界确保字符匹配,当窗口大小等于p长度时记录起始索引。该方案具有线性时间复杂度O(n+m)和常数空间复杂度O(1),是解决此类子串匹配问题的高效方法。
2026-01-29 22:33:23
459
4
原创 Linux 13 进程前言:冯诺依曼体系结构和操作系统
本文主要介绍了计算机系统的两个核心概念:冯诺依曼体系结构和操作系统。冯诺依曼体系结构由输入单元、中央处理器、存储器和输出单元组成,这种设计通过内存作为中间媒介,解决了CPU与外部设备速度不匹配的问题,是现代计算机性价比最优的选择。操作系统作为管理软件,其核心功能包括进程管理、内存管理等,既管理硬件资源,又为应用程序提供执行环境。文章通过银行服务的类比,解释了系统调用的必要性,即操作系统通过标准接口提供服务而不直接暴露底层资源。全文以通俗的实例(如发送消息、学校管理)阐述了计算机系统的关键设计理念。
2026-01-29 22:30:41
1078
12
原创 滑动窗口---- 无重复字符的最长子串
本文介绍了使用滑动窗口算法求解字符串中最长无重复字符子串长度的问题。通过维护左右指针动态调整窗口边界,并利用计数数组检测重复字符,实现了时间复杂度O(n)和空间复杂度O(1)的解决方案。文章包含算法思想、代码实现(C++)、复杂度分析和测试用例验证,展示了滑动窗口在处理子串问题中的高效性,特别适用于需要维护连续唯一字符的场景。
2026-01-28 22:33:24
338
5
原创 Linux 10:make Makefile自动化编译实战指南及进度条解析
本文介绍了Makefile的基本使用方法和自动化编译的优势。首先解释了Makefile的作用:通过定义依赖关系和依赖方式实现"自动化编译",只需一个make命令即可完成整个工程的编译。通过示例展示了简单的Makefile编写方法,包括编译规则和伪目标clean的设置。重点阐述了Makefile的工作原理:通过文件时间戳判断是否需要重新编译,并详细说明了gcc的编译流程。文章还介绍了使用通配符和变量优化多文件编译的方法,最后通过进度条实例演示了Makefile的实际应用,包括回调函数的使用
2026-01-28 22:30:54
1085
43
原创 双指针 --- 接雨水
本文介绍了使用双指针法解决LeetCode"接雨水"问题的思路。该问题要求计算柱子排列后能承接的雨水量,关键在于确定每个位置由左右两侧最高柱子中较矮者决定的储水量。双指针解法通过维护左右指针和两侧最大高度变量,在一次遍历中完成计算:比较两侧当前最大高度,从较小侧计算当前指针位置的储水量并移动指针。这种方法实现了O(n)时间复杂度和O(1)空间复杂度,优于传统的动态规划解法。文章提供了完整的C++代码实现,并通过示例验证了算法的正确性,最终输出结果6与题目预期一致。
2026-01-27 22:45:29
738
16
原创 Linux 9:GCC编译全流程详解
本文介绍了GCC编译器的使用方法和编译过程。首先说明GCC编译选项的基本格式,然后详细解析了编译的四个阶段:预处理(-E生成.i文件)、编译(-S生成.s汇编文件)、汇编(-c生成.o目标文件)和链接(生成可执行文件)。文章对比了静态链接和动态链接的区别,指出静态链接会复制库代码导致空间浪费但执行快,动态链接则通过共享库节省空间且更新方便。最后提供了保护源码的方法,建议将库文件预编译为.o文件再链接,避免直接暴露源代码。
2026-01-27 22:42:54
737
15
原创 双指针--双数之和
摘要:本文介绍了一种高效解决三数之和问题的方法。通过排序预处理后采用双指针策略,将时间复杂度从O(n³)优化到O(n²)。关键步骤包括:排序数组后固定第一个数,使用左右指针寻找满足条件的组合,并通过跳过重复值实现去重。当第一个数大于0时提前终止循环,进一步优化效率。该方法有效解决了暴力枚举的超时问题,同时保证了结果的正确性和唯一性。
2026-01-26 22:43:39
419
14
原创 Linux 6 权限管理全解析
Linux系统权限管理摘要 Linux系统权限管理分为用户权限和文件权限两部分。用户权限区分超级用户(root)和普通用户,通过su/su-命令切换,root拥有全部权限。文件权限涉及三类访问者:所有者(u)、所属组(g)和其他用户(o),通过字符(rwx)或八进制(755)表示权限。常用命令包括: chmod修改权限:字符方式(u+w)或数字方式(755) chown修改所有者 chgrp修改所属组 权限类型包括读(r)、写(w)和执行(x),对文件和目录作用不同。root可修改任何权限,普通用户只能修改
2026-01-26 09:30:28
1178
32
原创 双指针2--盛水最多的容器
本文解析了LeetCode第11题"盛最多水的容器"的两种解法。题目要求在给定高度数组中找到两条线,使其与x轴构成的容器面积最大。暴力解法通过双重循环枚举所有组合,时间复杂度O(n²)。更优的双指针解法从数组两端向中间移动,每次移动较短板的指针,时间复杂度优化至O(n)。文章详细阐述了双指针的贪心策略原理,并提供了C++代码实现,通过示例验证了算法的正确性,最终得出双指针法是解决此类区间问题的高效方法。
2026-01-25 23:03:10
440
18
原创 Linux 5 目录权限与粘滞位详解
本文探讨了Linux系统中目录权限管理的核心问题。首先分析了进入目录所需的可执行权限,以及目录读写权限对文件操作的影响,指出删除文件只需目录写权限而非文件权限的特性存在安全隐患。其次详细讲解了umask机制如何决定文件和目录的默认权限,通过掩码值调整新建文件的初始权限。特别强调了目录权限与文件权限的本质区别:可执行权限决定能否进入目录,可读权限控制目录内容查看,可写权限管理文件创建和删除。最后介绍了粘滞位(t)的解决方案,它能限制只有文件所有者、目录所有者或root用户才能删除文件,有效解决了共享目录下的权
2026-01-25 23:00:51
709
11
原创 双指针1:移动零
本文介绍了两种原地移动数组零元素的方法:双指针交换法和覆盖补零法。双指针法通过交换非零元素与指针位置,单次遍历即可完成操作,时间复杂度O(n),空间复杂度O(1)。覆盖补零法则先覆盖非零元素再补零,需两次遍历但逻辑更直观。两种方法都能保持非零元素顺序,双指针法操作次数更少,适合进阶要求。核心在于满足题目要求的原地修改和顺序保持。
2026-01-24 23:02:49
328
5
原创 Linux 4 指令结尾&&通过shell明白指令实现的原理
本文介绍了Linux系统的基础指令和操作原理。主要内容包括:1)bc指令的浮点运算功能;2)计算机体系结构、Linux版本和发行版的查看方法;3)常用热键如Ctrl+C、上下键、Tab等提高操作效率;4)Shell与内核交互的原理,通过媒婆比喻形象说明Shell作为命令解释器的作用。文章旨在帮助读者深入理解Linux底层结构,掌握常用指令原理,提升操作效率。
2026-01-24 23:01:12
3948
12
原创 哈希3 : 最长连续序列
本文探讨了如何在O(n)时间复杂度内找出未排序数组中最长连续数字序列的长度。通过使用哈希表存储数组元素实现O(1)查询,并采用关键优化:仅当数字是序列起点(即前驱数字不存在)时才计算序列长度。该方法避免了排序带来的O(nlogn)复杂度,确保每个数字最多被访问两次。C++实现展示了如何利用unordered_set快速查找,并通过遍历更新最长序列长度。该算法时间复杂度O(n),空间复杂度O(n),适用于处理数组去重和连续序列问题。
2026-01-23 09:15:49
488
5
原创 Linux 3 指令(3):进阶指令:文件查看、资源管理、搜索打包压缩详解
本文介绍了Linux系统中常用的文件操作、时间管理和搜索指令。文件操作部分详细讲解了cat/tac、nano、more/less、head/tail等命令的用法及选项;时间管理部分涵盖date命令的时间格式设置和时间戳转换,以及cal命令的日历查看功能;搜索指令部分介绍了find、whereis和grep命令的常见用法。文章通过具体命令示例演示了各工具的实际应用场景,如查看文件内容、编辑文本、查找日志信息等,帮助用户掌握Linux系统的基础操作技能。
2026-01-23 09:14:13
998
4
原创 哈希2:字母异位符分组
让所有字母异位词都对应同一个标识,这样就能用哈希表把它们分组。字母异位词指的是由相同字母重排形成的字符串,例如。这是 C++17 引入的语法,用于遍历哈希表时直接提取键值对。直接引用值(字母异位词列表),避免了拷贝,提升了效率。的所有权直接转移,而不是进行昂贵的深拷贝。可以提前分配足够的内存,避免后续。作为占位符表示我们不需要使用键,可以按任意顺序返回结果列表。要解决这个问题,关键是找到一种。时频繁扩容,从而提升性能。给定一个字符串数组,将所有。
2026-01-21 08:46:57
447
15
原创 Linux 2 指令(2)进阶:内置与外置命令解析
Linux指令本质上是系统预编译的可执行程序,分为内置指令(如cd、pwd)和外置指令(如ls、cp)。内置指令是Shell内部函数,执行效率高;外置指令是独立可执行文件。Linux遵循"一切皆文件"理念,重定向操作(>、>>、<)可控制数据流。常用指令包括:which(定位命令路径)、alias(设置别名)、man(查看手册)、echo(输出内容)、cp(复制文件)、mv(移动/重命名文件)。理解这些指令的底层逻辑和"一切皆文件"思想,能更高
2026-01-21 07:57:30
1370
3
原创 哈希1:两数之和:哈希表优化指南
本文介绍了力扣经典算法题"两数之和"的两种解法:暴力枚举法和哈希表优化法。暴力枚举法通过双重循环遍历所有数对,时间复杂度O(n²),空间复杂度O(1),适合小规模数据。哈希表优化法利用unordered_map存储已遍历元素,将时间复杂度降至O(n),空间复杂度O(n),适合追求高效的大规模数据处理。文章通过代码示例展示了两种方法的实现,并分析了各自的优缺点,强调了算法优化中空间换时间的思想,为读者提供了针对不同场景的解决方案选择建议。
2026-01-20 09:15:09
467
24
原创 Linux 1 指令(1)入门:6大基础指令详解
本文介绍了6个Linux基础指令: pwd:显示当前所在目录路径 ls:列出目录内容,常用选项-l显示详情,-a显示隐藏文件 cd:切换目录,支持绝对/相对路径,~返回家目录,..返回上级 touch:创建空文件或更新文件时间戳 mkdir:创建目录,-p可递归创建多级目录 rm:删除文件/目录,-r递归删除,-f强制删除 这些指令通过树状路径结构实现文件管理,比图形界面更高效。初学者需理解路径概念(绝对/相对路径)和文件类型标识(d目录/-普通文件)。配套的tree指令可直观查看目录结构。
2026-01-20 09:12:00
1625
40
原创 滑动窗口最大值:单调队列高效解法
摘要:本文介绍了利用单调队列高效解决滑动窗口最大值问题的方法。通过维护一个单调递减的双端队列,在O(n)时间复杂度内完成计算。核心步骤包括:维护队列单调性、移除窗口外元素、记录当前窗口最大值。相比暴力法的O(nk)复杂度,单调队列解法显著提升效率。文章提供了C++实现代码,并分析了示例运行过程。该方法同样适用于其他滑动窗口最值问题,具有通用性和高效性。
2026-01-01 08:36:18
406
17
原创 LeetCode 560题:和为K子数组最优解
摘要:本文讨论了统计数组中连续子数组和为k的两种解法。暴力解法使用前缀和数组,通过双重循环比较差值,时间复杂度O(n²)会超时。优化解法利用哈希表存储前缀和出现次数,只需单次遍历:维护当前前缀和sum,若sum-k存在于哈希表则累加次数,再将sum存入表。这种方法将时间复杂度降至O(n),空间复杂度O(n),是更优解。示例分析验证了算法的正确性。
2025-12-31 08:26:29
258
15
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅