自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 与堆有关算法题

因为所有的函数都是递增的,因此这种策略绝对是正确的。由题意可知,所有的二次函数的 A 和 B 都是大于 0 的,因此在 (x>0) 的区间内,所有函数值都是递增的。所以堆里面需要存一个结构体,标注:函数值 + 哪个函数 + 代入的值,然后按照函数值创建小根堆即可。首先,要经常拿到异性中舞蹈技术差值最小的值,所以考虑到用堆来解决问题,也就是用堆存所有相邻的异性,然后根据技术差建立小根堆。全部放进去,然后每次拿出堆顶元素a[i] + b[j]时,再把 a[I]+b[j+1] 放进去,这样重复n次即可。

2026-03-25 20:20:04 232

原创 与二叉树有关算法题

首先,由于它没有明确说明谁是左右孩子,所以只能用vector数组来存储,里面dfs的递归思想也是很常见,bfs就是用队列模拟找哪一层最多也不解释,最难的两点距离,本质就是求公共的祖先,用一个fa[N]数组存储父亲结点,然后把其中一个结点一直往上遍历直到根结点,然后存储中间遍历的所有结点,然后让另一个结点往上爬,遇到第一个中间遍历过的结点就行了。解释:原后序是 BDCA,去掉根A和左子树B,剩下 DC 对应右子树。⼆叉树的⾼度 = 1 + max(左⼦树的⾼度, 右⼦树的⾼度);因此,可以递归解决。

2026-03-22 16:20:20 341

原创 算法竞赛有关数据结构的补充(2)--- 栈、队列的静态实现和树的实现

树型结构是一类重要的非线性数据结构。有一个特殊的结点,称为根结点,根结点没有前驱结点。除根结点外,其余结点被分成 (M) 个互不相交的集合 (T_1、T_2、…、T_m),其中每一个集合 (T) 又是一棵树,称这棵树为根节点的子树。因此,树是递归定义的。

2026-03-19 21:45:12 370

原创 Linux下 进程控制(一) —— 进程的创建、终止和等待

综上,可以得出一个结论:进程执行的结果状态,可以用两个数字表示:int sig(退出信号)、int exit_code(退出码)。并且这些用户是不需要维护的,因为当一个进程退出的时候,OS会把进程退出的详细信息写入到进程的结构体中!!这也就是为什么进程在退出的时候需要僵尸进程维护自己退出状态的原因!!

2026-03-19 17:45:27 440 1

原创 与队列有关练习题

先来的乘客,在时间逐渐增大的时候会先出列。因此,可以用队列模拟整个过程。直接按照静态队列的实现方式进行模拟即可!类型的数组,快速判断元素是否在队列中。创建一个队列,模拟整个流程。

2026-03-16 20:40:51 228 1

原创 与栈有关的算法题

后缀表达式(Postfix Expression),也称为逆波兰表达式(Reverse Polish Notation, RPN),是一种将运算符写在操作数之后的数学表达式表示法。一直让元素进栈,进栈的同时判断是否需要出栈。当所有元素模拟完毕之后,如果栈中还有元素,那么就是一个非法的序列。模拟结束之后,把未匹配位置的左括号,添上一个相应的右括号。⽤栈模拟后缀表达式的计算过程。类型的数组标记哪些位置可以匹配,哪些位置不可以匹配。先用栈模拟一遍括号匹配的过程,同时用一个。用栈来模拟进出栈的流程。

2026-03-14 16:35:10 228

原创 与链表有关的算法题

而 STL 里面的 list 的底层就是动态实现的双向循环链表,增删会涉及 new 和 delete,效率不高,竞赛中一般不会使用,而是以静态实现的方式。本题相当于告诉了我们每一个点的后继,使用静态链表的存储方式能够很好的还原这个队列。次就删除后面的元素 (比如给的测试样例是每走3次删一个元素,我们每数2次就删除它后面的元素),这是因为单链表删除有个关键的步骤是。使⽤循环链表模拟即可!频繁的在某⼀个位置之前和之后插⼊元素,因此可以⽤双向循环的链表来模拟。关于链表的静态实现 可以参考我写的博客。

2026-03-12 18:16:04 144

原创 Linux下 进程(六)(程序地址空间)

打个比方:一个大富翁有10个私生子,10个私生子互相不知道各自存在,大富翁对每个私生子都画饼说:“我有10亿财产,以后都给你!每个私生子都很开心,但是大富翁做法本质就是画饼!10亿不可能给私生子,但是每个私生子在需要钱的时候,大富翁肯定都会给个一点!而私生子也不会直接要10个亿,因为请求不合理,但是他们每个人都自以为未来10亿都是属于自己的,但实际要钱的时候只会一点一点要。但是饼画多了,饼是不是也要管理?

2026-03-11 15:25:13 402 2

原创 算法竞赛有关数据结构的补充---顺序表、单、双向链表的静态实现

在算法竞赛中,我们主要关⼼的其实是时间开销,空间上是基本够⽤的。因此,定义⼀个超⼤的静态数组来解决问题是完全可以接受的。因此,关于顺序表,采⽤的就是静态实现的⽅式。当然顺序看着比较简单 我再插入一个C 把D插到BC中间。解法⼆:如果存储的值数据范围不⼤,可以⽤哈希表优化。直接⽆视 prev 数组,与单链表的遍历⽅式⼀致。根据之前的经验可知,最后修改p的前驱指针即可。直接使⽤ mp 数组优化了。解法⼀:遍历整个链表即可。

2026-03-09 19:32:23 180

原创 与vector容器有关练习题

vector的使用。

2026-03-08 17:56:56 367

原创 Linux下 进程(五)(命令⾏参数和环境变量)

函数能不能有参数?部分说明Argument Count:命令行参数的个数(包括程序名本身)Argument Vector:一个字符串数组,每个元素是一个命令行参数1.2 为什么要有看个例子就明白了:💡:命令行参数的本质应用,是为了实现一个命令,可以根据不同的选项,实现不同的子功能!也是Linux中所有命令选项功能的实现方式!!!环境变量()一般是指在操作系统中用来指定操作系统运行环境的一些参数,属于系统级别的变量,变量名和变量内容,往往具有全局性!在我们日

2026-02-11 20:29:36 1202

原创 Linux下 进程(四)(进程的组织、进程的切换和进程O(1)调度算法)

欢迎来到我的频道码云链接。

2026-02-09 07:45:31 851

原创 Linux下 进程(三)(进程的优先级)

欢迎来到我的频道码云链接。

2026-02-09 02:07:14 936

原创 Linux下 进程(二)(进程状态、僵尸进程和孤儿进程)

欢迎来到我的频道码云链接。

2026-02-08 20:35:01 590 1

原创 Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)

欢迎来到我的频道码云链接。

2026-02-04 08:58:28 931 2

原创 C++ 智能指针的使⽤及其原理(包含模拟实现)

函数用途operator=共享所有权swap()交换指针reset()释放资源get()获取裸指针operator*->访问对象查看引用数unique()是否唯一判空所有权排序unique_ptr函数用途operator=转移所有权(仅支持移动赋值,拷贝被禁用)swap()交换两个unique_ptr的内部指针(高效,不涉及资源复制)reset()释放当前管理的对象,并可接管新对象(安全重置)get()获取原始裸指针(用于兼容 C 接口,不可 delete)operator*->

2026-01-31 00:15:47 855 4

原创 C++ 异常详解

include <stdexcept> // 包含 std::runtime_error// 推荐:继承标准异常子类(而不是直接继承 exception)public:: std::runtime_error(msg) {} // 调用基类构造// 使用int main()tryconnect();// 输出自定义消息💡为什么不直接继承?因为的what()默认只返回空字符串,你需要自己管理错误信息。而已经实现了带字符串的构造和what(),更方便,当然你要自己实现what。

2026-01-28 21:21:35 753 5

原创 C++ 11 新增特性(下)

欢迎来到我的频道码云链接。

2026-01-26 21:54:35 662 3

原创 C++11 新增特性(中)

欢迎来到我的频道码云链接。

2026-01-25 22:00:03 763 5

原创 C++11 新增特性(上)

欢迎来到我的频道码云链接。

2026-01-23 18:16:34 655 4

原创 ⽤哈希表封装unordered_map和unordered_set(C++模拟实现)

在阅读本章节前 请保证掌握以下知识 哈希表的实现&&unorderedmap和unorderedset的使用 同时确保自己熟练掌握map和set的封装(因为里面除了底层一个是红黑树一个是哈希表外 基本区别不大 所以很多冲突部分都不会详细解释 也不会一步一步推导的写 而是围绕成品代码解释为什么这么写)哈希表(C++详解版&&线性探测法、哈希桶的实现)C++ unordered_map和unordered_set的使用C++ set&&map的模拟实现。

2026-01-22 18:14:22 614 6

原创 哈希表(C++详解版&&线性探测法、哈希桶的实现)

欢迎来到我的频道专栏作家码云连接。

2026-01-21 17:13:19 748 2

原创 C++ set&&map的模拟实现

学习本章节 必须掌握 红黑树的实现和 set&&map 的基本使用详情可以参考小编写的【set的使用】【map的使用】【红黑树】

2026-01-08 17:39:13 1062 1

原创 C++ unordered_map和unordered_set的使用

的声明如下,Key就是底层关键字的类型默认要求Key支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支持将Key转成整形的仿函数传给第二个模板参数默认要求Key支持比较相等,如果不支持或者想按自己的需求走可以自行实现支持将Key比较相等的仿函数传给第三个模板参数底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第四个参数。一般情况下,我们都不需要传后三个模板参数底层是用哈希桶实现,增删查平均效率是O1O(1)O1,迭代器遍历不再有序,为了跟set。

2026-01-07 15:25:59 726 1

原创 红黑树(C++实现)

特性说明作用定义一组命名的整型常量红黑树用途表示节点颜色(REDBLACK传统 enum简单但可能隐式转int,有命名冲突风险enum class类型安全、作用域隔离,C++ 推荐用法在红黑树实现中,使用enum(尤其是enum class)是标准且清晰的做法。

2026-01-03 15:08:27 1014 1

原创 AVL树(C++详解版)

此处采用。

2025-12-30 15:03:54 685 1

原创 C++ map和multimap的使用

map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第二个模版参数,map底层存储数据的内存是从空间配置器申请的。一般情况下,我们都不需要传后两个模版参数。map底层是用红黑树实现,增删查改效率是OlogNO(logN)OlogN,迭代器遍历是走的中序,所以是按key有序顺序遍历的。map底层的红黑树节点中的数据,使用存储键值对数据。std::pair是 C++ 标准库。

2025-12-28 16:28:32 902 1

原创 C++ set和multiset的使用

本文介绍了C++中序列式容器和关联式容器的区别,重点讲解了关联式容器set的使用方法。序列式容器存储线性序列数据,而关联式容器(如set/map)基于非线性结构,通过关键字访问数据。set底层采用红黑树实现,具有自动排序和去重功能,其元素不可修改。文章详细说明了set的构造方法、迭代器使用、插入删除操作(insert/erase/emplace等),以及高效的find查找功能(O(logN)复杂度)。通过代码示例展示了set的基本操作和特性,强调了其与算法库函数的性能差异。

2025-12-13 14:21:30 809 3

原创 二叉搜索树(C++实现)

场景2: 商场无人值守车库,入口进场时扫描车牌,记录车牌和入场时间,出口离场时,扫描车牌,查找入场时间,用当前时间-入场时间计算出停车时长,计算出停车费用,缴费后抬杆,车辆离场,删除入场时间和车牌。场景3: 统计一篇文章中单词出现的次数,读取一个单词,查找单词是否存在,不存在这个说明第一次出现,(单词加入树),单词存在,则++单词对应的次数。场景2: 检查一篇英文文章单词拼写是否正确,将词库中所有单词放入二叉搜索树,读取文章中的单词,查找是否在二叉搜索树中,不在则波浪线标红提示。

2025-12-08 21:03:21 1063 6

原创 C++ 多态详解

多态是一个继承关系下的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。

2025-12-04 23:35:56 856 4

原创 C++ 继承详解

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。下面我们看到没有继承之前我们设计了两个类Student和TeacherStudent和Teacher都有姓名/地址/电话/年龄等成员变量,都有identity。

2025-12-03 00:03:50 1080 3

原创 C++ 模版(进阶)(含array解析)

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。比如说一个函数 他只有.h文件的声明 没有.cpp的实现 那么他就会有链接错误 下图是文件编译的全过程:在汇编语言中 其实调用函数的本质 就是call + 函数地址,而函数其实跟数组很像,我们在test.cpp中对于函数的申明其实我们是没有它的地址的。而函数的地址是在定义中不是声明中。在有些编译器中test.cpp文件中汇编语言会形成call (?的声明。

2025-12-01 20:50:27 640 4

原创 C++ priority_queue的使用和模拟实现(含仿函数和函数对象的解析)

C++查询文档请转跳优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素 中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶 部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue 提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的 顶部。

2025-11-29 20:24:16 762 5

原创 C++ stack和queue的使用和模拟(含deque容器的底层解析)

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设 计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。在 C++ STL 中,容器适配器是一种特殊的容器,它不直接管理数据,而是通过“包装”一个已有的基础容器(如std::liststd::deque),并提供一个受限的、特定的接口来适配其行为。复用现有容器的功能,通过限制其接口来满足特定的数据结构需求。简化接口:提供了更简单、更专注的接口,使代码更清晰、更易于理解和维护。例如,使用。

2025-11-26 21:47:45 1020 6

原创 Linux下的代码调试器-gdb /cgdb 使用

在 GDB 调试中,条件断点是一种特殊的断点,它不是简单地在指定位置暂停程序,而是仅当满足用户设定的条件时才触发暂停。这种断点能精准过滤无关的执行流程,聚焦到需要调试的场景,尤其适用于循环、分支等复杂逻辑的调试。执行时监视一个表达式(如变量)的值。如果监视的表达式在程序运行期间的值发生变化,GDB 会暂停程序的执行,并通知使用者。如果你有一些变量不应该修改,但是你怀疑它修改导致了问题,你可以wtch它,如果变化了,就会通知你.虽然说可执行程序是二进制文件,但是内部的二进制是有自己的特定格式的类似于。

2025-11-22 20:55:38 994 6

原创 Linux 下的版本控制器Git

Git通过 “

2025-11-21 10:37:22 851 3

原创 Linux下的C语言系统小程序——进度条(附函数指针对代码解耦解析)

中的 缓冲区刷新函数,核心作用是 强制将标准 I/O 流(如 stdout、文件流)的缓冲区数据立即写入实际设备(终端、文件等),避免数据因缓冲区机制延迟输出 / 写入。函数指针的核心价值是「解耦代码、动态扩展」,适合需要灵活切换函数实现、隐藏底层细节、统一接口的场景 —— 这些场景下,函数指针能大幅降低代码修改成本,提升扩展性。Linux下一切皆文件,你的显示设备也可以理解是文件一种 属于IO流中的输出流,缓冲区是有归属的,很显然 这片缓冲区里的数据就归属于显示器(

2025-11-19 20:57:47 1101 2

原创 Linux下的项目自动化构建-make\makefile详解

自动变量核心含义关键特点适用场景$<指代第一个依赖文件只取依赖列表的「第一个」,忽略后续所有依赖1. 隐式规则(如.c→.o编译);2. 核心依赖明确的场景(如链接时只需要第一个.o触发)$^指代所有依赖文件(自动去重)包含依赖列表中所有文件,重复依赖会合并1. 链接多个.o文件生成可执行程序;2. 需用到所有依赖的场景(如打包、多文件编译)

2025-11-11 22:55:50 947 7

原创 Linux下的编译器gcc/g++

前提知识:保护宏能生效,关键在于 #define XXX 定义的宏是 全局有效的(在预处理阶段,宏的作用域是 “整个编译单元”,即单个 .cpp 文件及其所有包含的头文件 宏定义只会生效一次)。//头文件#ifndef MYMATH_H // 步骤1:判断宏是否未定义#define MYMATH_H // 步骤2:若未定义,定义该宏// 核心内容(声明)int y;#endif // 步骤3:结束条件判断//源文件#include "mymath.h" // 第一次包含。

2025-11-09 18:59:22 1037 5

原创 Linux下的软件包管理器&&vim编辑器详解与配置

在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序.但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装.软件包和软件包管理器,就好比 “App” 和 “应用商店” 这样的关系.

2025-11-08 20:44:52 896 4

空空如也

空空如也

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

TA关注的人

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