- 博客(36)
- 收藏
- 关注
原创 【C++算法】滑动窗口篇:长度最小的子数组
给定正整数数组和目标值target,求和≥target的最短连续子数组长度。利用滑动窗口(同向双指针)优化:right右移扩展窗口,sum≥target时记录长度并收缩left,因数组全为正数,sum单调变化,left、right各最多移动n次,时间复杂度O(n)。边界情况如target过大或单元素数组均能正确处理,返回0或1。核心思想:进窗口→判断→更新答案→出窗口,依赖单调性实现高效求解。
2026-11-04 14:30:32
346
22
原创 【C++】stack和queue
本文详解C++ STL中stack、queue、priority_queue三种容器适配器的原理与使用。它们非独立容器,而是基于deque(stack/queue)或vector(priority_queue)封装,限制接口以实现LIFO、FIFO及优先级出队语义。stack与queue默认用deque因其头尾操作高效、内存扩容平滑;priority_queue用vector因堆结构适合连续存储与缓存友好。三者均无迭代器,不可遍历,需通过top/front/back取值并pop删除,且空容器调用取值函数为未
2026-10-27 11:20:43
286
22
原创 【Linux】make & Makefile 核心知识点
Make是一款基于时间戳的构建工具,通过Makefile自动化编译与链接。其核心原理:若目标文件不存在或依赖更新,则执行命令;否则跳过。规则格式为target:prerequisites,命令前需用Tab。目标分文件目标(真实文件)和伪目标(.PHONY,如clean、all),后者不依赖时间戳,始终执行。常见问题包括头文件未显式声明为依赖,可通过-MMD生成依赖文件解决。常用自动变量如$@(目标)、$<(首个依赖)、$^(所有依赖)简化命令。变量支持递归赋值、简单赋值等四种方式,推荐使用:=。完整项
2026-10-25 23:06:36
322
22
原创 【Linux】编译器gcc/g++
本文面向C/C++初学者,系统讲解gcc/g++编译器核心用法,涵盖编译四阶段(预处理、编译、汇编、链接),对比静态库与动态库特性,梳理高频命令、头文件防重复包含写法、常用选项速查表及易错点,并提供最简实操串,助读者快速掌握从源码到可执行文件的完整流程。
2026-10-21 19:58:22
691
21
原创 【C++】模板进阶
本文介绍了C++中非类型模板参数、模板特化及分离编译问题。非类型模板参数(如size_t N)必须为编译期常量,支持整数、指针等,但不支持浮点数或类对象。模板特化分为函数与类模板特化,用于处理特殊类型,避免通用模板在特定场景下出错。类模板可全特化或偏特化,实现更灵活的定制。针对模板分离编译问题,提出三种解决方案:将模板声明与实现放在头文件、显式实例化、或通过#include合并实现,其中头文件方案最常用且推荐。
2026-10-15 17:58:37
440
23
原创 【C++】 priority_queue知识点总结
本文系统讲解STL中priority_queue(优先队列)的原理与应用。它作为容器适配器,底层基于堆(大顶堆/小顶堆),默认使用vector存储,通过less或greater仿函数控制优先级。核心操作包括向上调整(插入)和向下调整(删除),建堆时间复杂度为O(n)。强调comp(a,b)返回true表示a优先级低于b,决定堆性质。同时解析了容器适配器概念,对比stack、queue、priority_queue的底层容器要求与接口限制,指出其无迭代器、不可遍历的设计目的。最后深入仿函数机制,说明其作为二元
2026-10-13 13:24:01
408
23
原创 【Linux】基础开发工具---软件包管理器
在 Linux 下安装软件,原始方式:下载源代码→ 手动编译 → 生成可执行程序。缺点:编译麻烦,需要处理大量依赖库,不同机器编译环境不一样,容易编译失败。软件包:开发者提前把源码编译好,打包成一个文件(类似 Windows 的 exe 安装包),里面包含可执行程序、配置文件、手册、依赖信息。软件包管理器:用来检索、下载、安装、卸载、升级软件包,自动处理依赖关系。类比:软件包 = App;包管理器 = 手机应用商店。yum:RedHat / CentOS / Fedora(RPM 包格式。
2026-10-10 17:32:43
357
17
原创 【Linux】Shell 命令以及运行原理+权限管理
r w x,分 u (属主) g (组) o (其他);ls -l查看。,三组数字,u g o。文件类型位不属于权限位!第一位- / d / l不是 rwx 权限。目录 x 权限:控制能否 cd 进入目录。目录的x权限:控制能不能 cd 进入目录;没有 x,r 权限基本无效目录有 x、无 r:可以 cd 进入;ls 看不到文件名,但知道文件名就能访问目录 w 权限:控制创建 / 删除 / 重命名目录内文件,删除文件看目录权限,不看文件本身权限。
2026-10-10 16:18:04
1300
24
原创 Linux系统指令总结
本文面向Linux初学者,系统梳理文件操作、权限管理、压缩解压等高频命令,附完整示例与实战场景,涵盖ls、cd、cp、mv、chmod、tar等核心命令。通过典型用法与错误排查指导,帮助读者快速上手命令行,建立扎实运维基础,适用于Ubuntu等主流发行版。
2026-10-08 17:05:53
373
19
原创 【C++算法】四数之和
随后通过固定 a、b 两个数,再使用 left 和 right 双指针在剩余区间内扫描,整个过程只使用常数个指针变量,不依赖任何与输入规模相关的辅助数据结构。因此,无论输入数组多大,额外空间始终是常数级,即 O(1)。4.三数之和:固定一个数b,在b后面的区间范围内,采用双指针算法,找到两个数,使得两个数的和为target-a-b;3. 在 a 后面的数的区间范围内,采用三数之和的方法,找到三个数,使得三个数的和为 target - a;当使用完一次双指针算法的时候,b也需要去重,a也需要去重。
2026-09-27 16:25:53
368
17
原创 【C++算法】三数之和
三数之和是一道非常经典的算法题,核心思路是:先对数组排序,再固定一个数,通过双指针在剩余区间内寻找另外两个数,使三者之和为 0。整个过程需要重点处理好去重和边界条件,才能保证结果既不重复也不遗漏。两种解法各有适用场景:解法一(排序 + 暴力枚举 + set 去重)实现简单、思路直观,适合数据规模较小或仅用于学习算法思路的场景;解法二(排序 + 双指针)时间复杂度优化到 O(n²)、空间复杂度降低到 O(1),更适合处理大规模数据,也是实际工程和面试中更推荐的方案。
2026-09-27 12:00:00
576
28
原创 【C++】Vector类+手搓代码
本文系统梳理C++ vector核心知识点,涵盖构造方式、容量接口、元素访问、迭代器失效及扩容机制。重点强调:reserve仅预分配内存不改变size,resize则修改有效元素数量;g++下vector采用2倍扩容,导致迭代器失效;emplace_back比push_back高效因避免临时对象拷贝。总结:vector适合随机访问与尾部操作,list适用于频繁中间插入删除,deque兼顾双端操作与随机访问。面试高频考点包括扩容机制、迭代器失效场景及reserve与resize区别。
2026-09-23 15:30:00
446
21
原创 【C++算法】和为s的两个数
在升序数组中寻找两数之和等于目标值的解,可采用双指针法:左指针从头开始,右指针从尾开始,根据当前和与target的大小关系调整指针位置。若和过大则右指针左移,过小则左指针右移,相等时返回结果。该方法时间复杂度为O(n),空间复杂度O(1),优于暴力解法的O(n²)。适用于有序数组,尤其在数据量大时效率显著。
2026-09-21 19:00:00
301
14
原创 [C++算法]盛最多水的容器(双指针算法)
双指针解法是解决「盛最多水的容器」问题的高效方法,其关键在于利用容器的短板效应:每次移动较矮一侧的指针,在宽度减小的同时有机会提升容器高度,从而在 O(n) 时间内找到最大容积。该解法适用于需要在一维数组中寻找满足某种约束的最优区间问题,尤其是当问题具有单调性、且最优解可以通过收缩边界逐步逼近时。理解这一思路,有助于举一反三地解决其他双指针类题目。
2026-09-18 11:15:14
390
18
原创 Linux基础指令(续集)
不包含业务数据,用来描述文件本身:文件名、大小、创建时间、修改时间、权限、位置、MFT 记录号(Windows NTFS)/ inode(Linux)。Windows 中,文件夹本质也是一种特殊文件(目录文件)。功能:touch 命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。真正存的东西:文字、图像、二进制代码等,是文件承载的有效数据。Windows 系统当中,标识文件唯一性,是通过路径标识的!Linux 系统当中,可以存在隐藏文件,隐藏文件通常是以。
2026-09-17 13:00:00
899
19
原创 Linux基础指令
Linux 命令行是开发者与服务器交互的核心工具,掌握基础指令是高效使用 Linux 系统的第一步。用于查看目录和文件信息,用于显示当前所在目录,用于切换工作目录。阅读本文前,建议你具备基本的终端操作基础,例如能够打开终端、输入命令并观察输出结果;如果尚未接触过终端,也不必担心,本文会从最基础的语法讲起,帮助你逐步建立对 Linux 命令行的整体认识。
2026-09-16 13:57:03
739
21
原创 [C++算法]快乐数
更重要的是,快乐数序列中的数值会迅速缩小。以最大的 10 位数 9999999999 为例,其各位平方和为。,通常是忽略了「平方和运算会迅速压缩数值范围」这一关键性质,误把循环次数当成了与。这个有限区间内,快慢指针最多在这个区间内循环若干次就会相遇,循环次数是一个与。之后,数值都会立刻降到 810 以下。时,1² = 1,直接满足条件,无需任何迭代即可返回。的循环,始终无法变为 1,因此 2 不是快乐数。最终结果为 1,因此 19 是快乐数。,因此单次计算平方和的代价是。,也就是说,无论初始的。
2026-09-08 12:05:29
980
17
原创 【C++】算法双指针算法1
0,dest]:非零元素 [dest+1,cur-1]:零元素 [cur,n-1]:待处理的元素。1.遇到0元素cur++ 2.遇到非零元素,让dest先++,然后让dest与cur交换,cur++划分为三个区间:[0,dest],[dest+1,cur-1],[cur,n-1]dest:以及处理的区间内,非零元素的最后一个位置。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。cur:从前往后依次遍历数组元素。题目描述:给定一个数组。
2026-09-03 12:00:00
790
13
原创 【C++】String类+手搓代码
3. resize(size,n)与 resize(size,n,char)都是将字符串中有效字符个数改变到n个,不 同的是当字符个数增多时:resize(n)用0来填充多出的元素空间, resize(size,n,char)用字符c来填充多出的元素空间。C++11 中,标准委员会变废为宝赋予了 auto 全新的含义,即:auto 不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto 声明的变量必须由编译器在编译时期推导而得。将有效字符的个数该成 n 个,多出的空间用字符 c 填充。
2026-09-02 11:37:46
245
13
原创 【C++】模板初阶
在 C++ 等强类型语言中,如果我们需要为不同数据类型编写功能相同但类型不同的函数或类,传统做法往往需要重复编写多份几乎相同的代码,既增加了维护成本,也容易引入错误。泛型编程正是为了解决这一问题而诞生的编程范式,它通过将类型参数化,让我们能够编写与具体类型无关的通用代码,从而实现代码复用。模板(Template)是泛型编程的基础,它允许我们在定义函数或类时使用类型占位符,待实际使用时再由编译器根据具体类型生成对应的代码。
2026-09-01 15:00:00
278
9
原创 [C++] 内存管理
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是: new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申 请空间失败时会抛异常,malloc会返回NULL。注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete[],注意:匹配起来使用。malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。
2026-08-31 14:30:00
549
10
原创 类和对象下(内部类,匿名对象,对象拷贝时的编译器优化)
• 内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考 虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地⽅都⽤不了。内部类是⼀个独⽴的类,跟定义在全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。• 对比可见:开启优化后,传参时省略了形参的拷贝构造,返回值时也省略了临时对象的拷贝构造,整体少调用了两次拷贝构造,析构次数也随之减少,程序运行效率更高。• 对比可见:有名对象。
2026-08-30 12:00:00
296
10
原创 类和对象(下)
• 尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。• 友元提供了⼀种突破类访问限定符封装的⽅式,友元分为:友元函数和友元类,在函数声明或者类 声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。• C++11 支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的。• 友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元。
2026-08-29 17:22:19
564
5
原创 拷贝构造,赋值运算符重载,const成员函数(类和对象上)
像Stack这样的类,虽然也都是内置类型,但是_a指向了资源,编译器⾃动⽣成的赋值运算符重载完成的值拷⻉/浅拷⻉不符合我们的需求,所以需要我们⾃⼰实现深拷⻉(对指向的资源也进⾏拷⻉)。像Stack这样的类,虽然也都是内置类型,但是_a指向了资源,编译器⾃动⽣成的拷⻉构造完成的值拷⻉/浅拷⻉不符合我们的需求,所以需要 我们⾃⼰实现深拷⻉(对指向的资源也进⾏拷⻉)。但是如果返回对象是⼀个当前函数局部域的局部对象,函数结束就销毁了,那么使⽤ 引⽤返回是有问题的,这时的引⽤相当于⼀个野引⽤,类似⼀个野指针⼀样。
2026-08-29 11:34:41
482
6
原创 类和对象(上)
那么成员函数是否包含呢?再分析⼀下,对象中是否有存储指针的必要呢,Date实例化d1和d2两个对象,d1和d2都有各⾃独⽴的成员变量 _year/_month/_day存储各⾃的数据,但是d1和d2的成员函数Init/Print指针却是⼀样的,存储在对象中就浪费了。这⾥需要再额外哆嗦⼀下,其实函数指针是不需要存储的,函数指针是⼀个地址,调⽤函数被编译成汇编指令[call 地址],其实编译器在编译链接时,就要找到函数的地址,不是在运⾏时找,只有动态多态是在运⾏时找,就需要存储函数地址,这个我们以后会讲解。
2026-08-13 21:06:07
261
13
原创 C++入门和初阶(指针和引⽤的关系,Inline,nullptr)
• inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。,省去函数调用的栈操作开销,从而提升执行效率;• C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调试,C++设计了inline⽬的就是替代C的宏函数。C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代。
2026-07-14 22:31:28
365
10
原创 c++初阶入门(引用,引用的特性,引用的使用,引用的使用)
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。类型& 引用别名引用对象;// C++ 标准对 main() 函数有特殊规定:main() 函数是唯一允许不写 return 语句的函数。引用在定义时必须初始化。一个变量可以有多个引用。引用一旦引用一个实体,就不能再引用其他实体。引用在实践中主要用于引用传参和引用做返回值中,以减少拷贝、提高效率,并在改变引用对象时同时改变被引用对象。
2026-07-07 13:37:45
360
8
原创 c++初阶入门(命名空间,C++输⼊&输出,缺省参数,函数重载)
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。2.namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2026-07-04 11:49:53
606
8
原创 数据结构-------------二叉树下
二叉树由若干节点构成,每个节点包含三部分:数据域、左孩子指针、右孩子指针;空树用 NULL 表示。深度:自上而下,从根节点数到当前节点的层数,根深度为 1;高度:自下而上,从当前节点数到最远叶子的层数,叶子高度为 1,空树高度 0;树的高度 = 树的最大深度,数值相等,但统计方向相反;满二叉树第 k 层最多拥有 2^(k-1) 个节点;高度 h 的满二叉树最多有 2^h -1 个节点。
2026-06-18 20:14:47
213
7
原创 数据结构----------二叉树(上)
紧接着上次的内容,今天要讲的是二叉树的内容也就是二叉树的链式存储结构!此内容大量涉及函数的递归,以及函数栈帧的创建和销毁,请给位小伙伴回顾这方面的知识以便于理解。
2026-06-07 18:42:50
383
13
原创 数据结构-------------堆
堆是完全二叉树,分大顶堆小顶堆大顶堆:根节点值≥左右孩子,整树父节点都大于等于子节点小顶堆:根节点值≤左右孩子,整树父节点都小于等于子节点存储方式:顺序存储(数组),不用链表 下标规则(数组从0开始):2*i + 12*i + 2。
2026-05-28 11:31:55
599
14
原创 数据结构--------单链表下
单链表 六大基础操作 文字步骤描述一、头删判断链表是否为空,为空则直接结束。用临时指针记录当前头结点。头指针指向原头结点的下一个结点。释放临时指针指向的原头结点内存。二、尾删判断链表是否为空,为空直接结束。定义指针从头遍历,找到最后一个结点的前驱结点。临时指针记录尾结点。把前驱结点的 next 置为空。释放原尾结点内存。三、指定位置插入判断位置是否合法,不合法直接结束。遍历找到指定位置的前驱结点。新建结点并赋值数据。新结点 next 指向原指定位置结点。
2026-05-14 19:10:59
605
8
原创 自己的规划
各位大家好啊,第一天来了博客,我还是一名研一的学生。最近在学习有关编程的知识,我的编程目标是完全掌握所学习的东西,成为代码大侠哈哈哈哈哈。我按照学习目标明天学习编程。我最想进入的IT公司是腾讯。
2026-04-17 17:24:30
81
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅