- 博客(68)
- 收藏
- 关注
原创 Linux--gcc/g++
本文介绍了gcc/g++编译器在Linux系统中的使用方法和编译原理。主要内容包括:1)编译过程的四个阶段(预处理、编译、汇编、链接)及其对应的gcc选项(-E、-S、-c);2)动静态库的区别,动态库(.so)采用共享方式加载,静态库(.a)将代码直接拷贝到可执行文件中;3)两者的优缺点对比,动态库节省空间但依赖性强,静态库独立性强但体积较大。文章通过具体示例说明了各编译阶段的操作方法和生成文件,并解释了库文件在程序开发中的作用。
2025-12-18 13:45:19
721
原创 C++--右值和移动语义
本文探讨了C++11中引入的右值引用概念及其应用。首先区分了左值和右值的定义,指出右值通常是临时对象或常量。然后分析了左值引用和右值引用的语法规则及生命周期管理特点,强调右值引用能延长临时对象的生命周期。重点阐述了移动构造和移动赋值机制,通过"抢夺"内存而非深拷贝来优化性能,特别适用于需要频繁拷贝构造的场景。最后总结指出,左值引用和右值引用的核心目标都是减少拷贝、提高效率,而移动语义在深拷贝情况下尤为有效。
2025-12-17 16:07:04
339
原创 C++--哈希封装my_unordered_set和my_unordered_map
本文介绍了哈希表的封装实现及其在unordered_set和unordered_map中的应用。主要内容包括:1) 基本节点结构的修改,通过模板参数T实现通用性;2) 哈希表迭代器的实现,包含节点指针和哈希表指针,支持++操作;3) HashTable基本结构,通过友元声明使迭代器能访问私有成员;4) unordered_set的封装实现,使用SetKeyOfT仿函数获取键值。文章重点阐述了哈希表迭代器的核心逻辑,包括跨桶遍历的实现方法,以及如何通过模板参数区分set和map类型。该实现为unordered
2025-12-12 19:52:46
397
原创 Linux--vim编辑器
本文介绍了vim编辑器的基本使用方法与技巧。首先说明vim是vi的升级版,具有三种主要模式:命令模式(光标移动、复制粘贴等操作)、插入模式(文本输入)和底行模式(保存退出等命令)。重点讲解了命令模式下的常用快捷键,如gg/G跳转行首行尾、yy/dd复制剪切、u撤销等操作。此外还介绍了批量化注释、替换、分屏等实用技巧,以及通过.vimrc文件配置vim环境的方法,提供了一键配置vimforcpp的简易方案。文章内容实用,适合初学者快速掌握vim的基础操作。
2025-12-11 15:58:46
729
原创 哈希表实现--开放定址法
本文摘要:哈希表是一种通过哈希函数建立关键字与存储位置映射关系的数据结构。文章介绍了哈希冲突(不同关键字映射到同一位置)、负载因子(已存数据量与表大小的比值)等核心概念,并阐述了将关键字转化为整数的方法。重点讲解了处理哈希冲突的两种主要方法:开放地址法(包括线性探测、二次探测等)和链地址法(使用链表解决冲突)。文章还提供了链地址法的代码实现,包括节点结构、仿函数特化和扩容策略(使用质数表控制扩容大小),并详细说明了插入操作的实现过程。
2025-12-10 22:22:30
618
原创 Linux权限
Linux文件权限管理摘要:Linux通过角色(u,g,o)和权限位(r,w,x)控制文件访问。权限管理包括:1)chmod修改权限;2)chown/chgrp修改所有者/组;3)umask设置默认权限。目录权限中,r权限控制查看,w控制创建/删除,x控制进入。为保护公共目录文件不被非所有者删除,引入粘滞位机制。权限设置遵循"最终权限=默认权限&(~umask)"规则,普通用户只能修改自己创建的文件权限。
2025-12-04 14:39:49
432
原创 C++ 封装红黑树实现mymap和myset
本文基于红黑树实现了map和set的封装。通过类模板T统一处理不同类型数据,利用仿函数区分set和map的比较逻辑:set直接比较key,map比较键值对的key值。在实现上,set和map都包含迭代器、insert和find等基本接口,其中map还实现了[]运算符重载。特别处理了map中键不可修改而值可修改的特性,通过在pair类型中对key添加const限定来实现。最终实现了基于同一红黑树底层结构的map和set封装,保持了STL容器的核心功能。
2025-12-03 11:21:35
400
原创 C++--红黑树的实现
进⼀步分析,c(新增节点)是红⾊,p(新增节点的父亲节点)为红,g(父亲节点的父亲节点)必为⿊,这三个颜⾊都固定了,关键的变化看u(父亲节点的另一个孩子节点)的情况,需要根据u分为以下几种情况分别处理。2,非空树插⼊后,新增结点必须红⾊结点,如果⽗亲结点是⿊⾊的,则没有违反任何规则,插⼊结束,这就是上述的插入成功的情况。若p是g的右节点,c是p的左节点,则需要先以p节点进行右单旋,之后以g节点进行左单旋了,即右左双旋,c变黑,g变红。此时c节点一定为新增节点。若p是g的左节点,c是p的左节点,进行右单旋。
2025-09-24 13:45:55
625
原创 AVLTree的实现
摘要:本文详细介绍了AVL树的自平衡二叉搜索树特性及其实现。AVL树通过平衡因子(-1/0/1)控制高度差,保证插入、查找等操作的时间复杂度为O(logN)。重点讲解了AVL树的四种旋转操作(左旋、右旋、左右双旋、右左双旋)来维持平衡,并提供了完整的C++代码实现,包括节点结构、插入操作、平衡因子调整和验证方法。文中通过图示和代码示例展示了不同情况下的旋转处理,最后给出了完整的AVL树实现模板类。
2025-08-17 18:47:16
866
2
原创 二叉搜索树的模拟实现
本文介绍了二叉搜索树的数据结构及其基本操作。二叉搜索树具有左子树值小于等于根节点、右子树值大于等于根节点的特性,其时间复杂度最优为O(logN),最差为O(N)。文章详细阐述了二叉搜索树的节点结构、插入逻辑(通过比较key值确定位置)、查找算法(类似插入过程),重点分析了删除操作的三种情况:左右子树为空、单子树为空、双子树非空(需替换删除)。实现时需特别注意对父节点的标记处理,为后续AVL树和红黑树的学习奠定基础。
2025-08-17 08:34:46
1063
原创 算法讲解--水果成篮
题目要求从一系列水果树中选择连续子数组,使得子数组中最多包含两种水果类型,并找出最大子数组长度。关键点在于使用滑动窗口法,通过维护一个map记录当前窗口内水果类型及其数量。当窗口内类型超过两种时,移动左指针缩小窗口,直到满足条件。最终返回最大有效窗口长度。该方法避免了暴力枚举的低效,优化了时间复杂度。示例代码展示了如何用双指针实现滑动窗口,练习可通过LeetCode 904题进行巩固。
2025-08-11 17:56:23
864
原创 算法讲解--将x减到0的最小操作数
摘要:该问题要求通过从数组两端选取数字减去目标数X,找到使X恰好减为0的最小操作次数。解题思路是将问题转化为寻找连续子数组的和等于总和减X的差(target),从而转换为求满足条件的最大子数组长度,最终用数组长度减去该长度即为最小操作数。算法采用滑动窗口法优化暴力枚举,时间复杂度为O(n)。需要注意边界条件如target为负数或零的情况。代码实现展示了滑动窗口的具体应用,并通过练习链接提供了实践机会。
2025-08-11 10:56:17
651
原创 算法讲解--最大连续1的个数
本文介绍了寻找数组中最多翻转k个0为1后最长连续1子数组的算法。核心思路是使用滑动窗口法:维护左右指针left和right,统计窗口内0的数量。当0的数量超过k时,移动left指针并减少0计数;否则继续扩展right指针。每次窗口扩展时更新最大连续1的长度。该方法避免了暴力枚举,将时间复杂度优化至O(n)。文章通过示例详细演示了算法流程,并提供了C++代码实现,其中zero变量记录窗口内0的数量,nurber记录最大长度。最后推荐在LeetCode上进行练习巩固该算法。
2025-08-03 20:36:59
839
原创 C++--多态
本文介绍了C++中多态的概念与实现方式。多态分为编译时多态(静态多态,如函数重载)和运行时多态(动态多态)。动态多态通过虚函数实现,需要满足两个条件:1)使用基类指针或引用调用虚函数;2)派生类对基类虚函数进行重写。文章详细讲解了虚函数的重写规则、析构函数的重写必要性、override和final关键字的作用,以及纯虚函数与抽象类的特性。通过售票和动物叫声等实例,说明了多态如何实现同一函数在不同对象上产生不同行为的效果。
2025-08-01 20:47:08
978
原创 算法讲解--长度最小的子数组
摘要 本文介绍了求解最小长度子数组的问题,要求子数组和≥target且元素连续。分析了暴力枚举法的不足,提出更优的滑动窗口算法:通过双指针动态调整窗口范围,当和≥target时记录最小长度并移动左指针,否则扩展右指针。给出了C++实现代码,强调边界条件处理,并提供了力扣练习链接。该算法时间复杂度为O(n),有效解决了连续子数组求和问题。
2025-07-29 10:19:58
283
原创 算法讲解--三数之和
这篇讲解介绍了如何用双指针法解决「三数之和」问题。核心思路是先将数组排序,然后固定一个数作为基准,在剩余部分使用双指针寻找和为固定数相反数的两个数。通过跳过重复值来避免结果重复,时间复杂度优化至O(n^2)。代码实现中使用了三层while循环处理去重问题,最终返回所有满足条件的三元组。
2025-07-28 10:49:40
763
原创 算法讲解--查找总价值为目标值的两个商品
本文介绍了在升序数组中寻找两个数使其和等于目标值的算法。暴力解法采用双重循环,时间复杂度O(N²)可能超时。更优解法是双指针法:初始时左指针指向最小元素,右指针指向最大元素,通过比较当前和与目标值调整指针位置(和过大则右指针左移,过小则左指针右移),时间复杂度O(N)。该算法适用于有序数组,能高效找到解或确定无解。文末提供了LeetCode练习题供巩固。
2025-07-25 15:22:35
464
原创 算法讲解--有效三角形的个数
【摘要】本文介绍了如何统计数组中能构成有效三角形的组合数量。关键点在于判断三边是否满足三角形条件:有序数组中只需判断最小两边之和大于第三边。通过排序可将时间复杂度从O(n^3)优化到更优。文章详解两种解法:1)暴力法通过三重循环枚举所有组合;2)双指针法在排序后固定最大边,用双指针高效统计有效组合。最终给出C++实现代码,并推荐LeetCode相关练习题。两种方法均需先排序,双指针法效率更高。
2025-07-25 14:43:39
1028
原创 算法讲解--盛最多水滴容器
摘要:本文介绍了求解最大水池面积的算法。通过暴力解法(O(N²))和双指针法(O(N))对比,重点讲解了双指针法的原理:从数组两端向中间移动,每次移动较小高度的指针,记录各区间最大面积。代码实现采用双指针遍历,动态更新最大面积,避免了额外空间开销。最后推荐LeetCode相关练习题。
2025-07-24 09:17:42
386
原创 Linux--指令初识
本文介绍了Linux常用指令及其用法:1. 目录操作指令:pwd显示当前路径,mkdir创建目录,rmdir删除空目录(支持-p参数删除父目录),rm删除文件或目录(-r递归删除,-i询问确认)2. 文件查看指令:cat查看文件内容(-b/-n编号),more/less分页查看(less支持双向翻页),head/tail查看文件首尾内容3. 其他指令:mv移动/重命名文件,man查看命令手册,echo配合>或>>实现文件重定向/追加重定向4. 文件类型:包括普通文件(-)、目录(d)、字符
2025-07-22 20:50:26
620
原创 Linux--初识linux
本文介绍了Linux系统的基本概念和常用指令。重点讲解了文件/目录的概念,包括文件=内容+属性的特性。详细说明ls指令的三种用法:ls显示文件名、ls -l显示详细信息、ls -a显示所有文件(含隐藏文件)。同时解释了Linux树形目录结构和两种路径表示方式(绝对路径与相对路径),以及cd指令用于切换工作目录的用法。最后指出Linux指令本质上是可执行文件。这些基础知识为Linux操作提供了入门指导。
2025-07-21 20:32:48
444
原创 算法讲解--快乐数
摘要:本文介绍了判断"快乐数"的两种算法。快乐数指经过各位平方和后最终等于1的数字。第一种方法基于快乐数在1000次运算内必循环的规律,通过1000次迭代验证结果是否为1。第二种方法采用双指针技术,通过快慢指针检测循环,若相遇时值为1则为快乐数。两种方法都通过辅助函数计算数字各位平方和。文章最后推荐在LeetCode平台练习相关题目(202题)。
2025-07-21 11:30:08
423
原创 算法讲解--复写零
文章摘要:本文介绍两种在数组中处理零元素的方法。双指针法通过从数组末尾开始复写,遇到零时插入新零并调整指针位置;vector库法则利用insert和resize函数直接在前端插入零并截断数组。两种方法均需处理边界情况,如指针越界或数组长度限制。文末提供力扣练习题链接以供实践。
2025-07-20 17:23:32
315
原创 算法讲解-移动零
本文介绍了使用双指针法解决数组零元素移动问题的算法原理。通过维护两个指针(dest和cur)将数组划分为已处理非零区和未处理区,遍历时遇到非零元素就交换到非零区末尾,最终实现所有零元素移动到数组末尾的目的。代码实现简洁高效,时间复杂度为O(n)。文末提供了LeetCode练习链接供读者实践。
2025-07-17 17:36:00
465
原创 C++--priority_queue的模拟实现
本文介绍了优先级队列的实现方法,重点讲解了堆调整算法和仿函数两个关键技术。优先级队列基于堆结构实现,通过向上调整(AdjustUp)和向下调整(AdjustDown)算法维护堆的有序性。仿函数(Less/Greater)用于控制排序顺序,通过运算符重载实现比较逻辑。文章给出了一个完整的优先级队列模板类实现,包含push、pop、top等基本操作,其中push操作后执行向上调整,pop操作后执行向下调整。该实现使用模板参数化容器类型和比较方式,默认采用vector容器和Less仿函数实现大堆结构。
2025-07-14 18:54:12
347
原创 C++--queue的模拟实现
本文介绍了队列(queue)的模拟实现方法。与栈(stack)类似,队列主要通过适配器模式和双端队列(deque)来实现。队列作为先进先出(FIFO)的数据结构,核心接口包括push(尾部插入)、pop(头部删除)、front/back(获取首尾元素)以及size/empty等基本操作。文章给出了基于deque的模板类实现框架,展示了如何通过封装deque的push_back、pop_front等操作来实现队列功能。这种实现方式简洁高效,充分利用了现有容器特性。
2025-07-14 10:31:15
423
原创 C++--List的模拟实现
本文介绍了C++中list的模拟实现方法。首先阐述了list作为带头双向循环链表的特点,指出其物理空间不连续的特性决定了需要特殊处理迭代器。然后详细说明了实现的三部分:1)节点类封装了数据存储和前驱/后继指针;2)迭代器类通过模板参数区分const和非const类型,实现了指针操作符重载;3)list类框架搭建及核心接口实现,包括插入/删除操作及容量管理。重点强调了迭代器封装的设计思想,这种实现方式有助于深入理解STL容器的底层机制。整个模拟实现过程展现了链表类数据结构的典型设计模式。
2025-07-13 17:10:28
376
原创 C++--List
list作为C++STL库中非常常见的容器。熟练的掌握list各个函数接口的使用方法和使用逻辑显得十分重要,因此下文将介绍list的主要的用法,注意事项以及测试用例。
2025-07-13 11:49:09
689
原创 排序--计数排序
计数排序的时间复杂度为ON远远小于一般排序,且该排序为稳定排序。对于动态范围或未知范围的数据,需先遍历确定范围值,增加预处理开销。遍历原数组时,先用最小值调整每个元素,将其转换为计数数组的索引位置。完成所有元素的遍历后,即可生成最终的计数数组。经过遍历得到最小值为1,最大值为9。用最大值减去最小值再加1,可得出数据范围为1到9,共包含9个不同数值。通过计算两者差值确定数据区间范围,据此确定统计次数数组的分配空间大小。统计数组的每一个数据加上min就得出原数组的值。统计数组的顺序就是原数组排序后的相对位置。
2025-06-13 19:20:35
642
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅