- 博客(73)
- 收藏
- 关注
原创 算法竞赛中的树
本文介绍了树的基本概念和用vector实现树的存储与遍历方法。首先详细讲解了树的核心术语(如节点、根、叶子节点等)和本质特性(连通性、无环性)。然后重点阐述了通过vector数组模拟邻接表存储树结构,并给出深度优先遍历(DFS)和广度优先遍历(BFS)的具体实现代码。DFS采用递归方式优先访问深层节点,BFS使用队列按层次遍历。文章通过示例树结构演示了两种遍历过程,帮助读者理解树结构的存储和遍历原理。
2025-11-20 21:41:06
549
原创 C++11(上)
本文介绍了现代C++(C++11及后续版本)相较于传统C++(C++98/03)的核心改进,重点讲解了列表初始化机制。主要内容包括: 现代C++特点:引入智能指针、自动类型推导、Lambda表达式、移动语义等特性,提高了安全性、易用性和性能。 列表初始化: 使用花括号{}统一各种初始化场景(变量、数组、结构体、容器等) 解决传统初始化语法歧义,禁止窄化转换提升安全性 简化标准库容器和智能指针的使用 列表初始化与std::initializer_list的区别: 列表初始化是语法规则,适用于所有初始化场景 s
2025-11-18 21:41:27
565
原创 算法竞赛中的队列
本文介绍了队列数据结构的基本概念、实现方法和应用场景。主要内容包括: 队列基础:讲解FIFO特性、标准库操作和数组/链表实现方式。 数组模拟队列:通过指针控制实现入队、出队等核心操作。 实际应用:以洛谷B3616队列模板题为例,展示数组模拟队列的解题方法,包含完整代码实现。 进阶问题:分析机器翻译题的FIFO缓存淘汰机制,指出队列的应用场景。 文章通过代码示例和习题解析,帮助读者掌握队列的核心思想和实现技巧,适用于任务调度、广度优先搜索等需要顺序处理的场景。
2025-11-13 21:12:07
920
原创 Linux:git和cgdb
文章摘要 本文介绍了版本控制工具 Git 及其常用指令,包括 clone、add/commit/push(三板斧)、status/log/pull,并对比了 Git、GitHub 和 Gitee 的区别。此外,还讲解了 gdb 和 cgdb 调试工具的使用方法,强调编译时需加 -g 选项才能调试。内容通俗易懂,适合开发者快速掌握基础操作。
2025-11-13 09:33:02
777
原创 算法竞赛中的vector和静态数组
静态数组:胜在效率与纯粹性,适合固定大小、高频访问场景,需注意避免栈溢出(全局/static修饰大数组)。vector:胜在灵活性与安全性,适合动态大小、需频繁调整的场景,reserve和swap是关键优化手段。二维结构:静态数组(固定行列)和(固定行+动态列)是高频选择,全动态仅作为行列均未知时的最后手段。根据题目数据范围、内存限制和操作类型灵活搭配,可平衡效率与稳定性,最大化竞赛得分效率。
2025-11-09 22:17:19
945
原创 Linux:make自动化和实战演练
本文介绍了Linux下make与Makefile的基本概念和使用方法。首先解释了make工具和Makefile的关系,Makefile定义了项目的编译规则和依赖关系,而make是执行这些规则的命令工具。通过一个查找素数的C程序示例,演示了如何编写简单的Makefile,包括定义变量、指定目标依赖关系和编译方法。重点讲解了Makefile的语法格式,包括依赖关系与依赖方法的合理性、伪目标(.PHONY)的正确使用场景等核心概念。文章指出,Makefile能实现自动化编译,提高开发效率,是衡量大型工程能力的重要
2025-11-08 15:56:13
672
原创 算法竞赛中的栈
本文介绍了栈的基本概念及其实现方式。栈是一种遵循"后进先出"(LIFO)原则的线性数据结构,仅允许在栈顶进行插入和删除操作。文章通过数组模拟实现了栈的基本操作(push、pop、top、empty、size),并提供了两道栈相关的习题解答。第一题要求实现支持多组数据操作的栈,强调了对空栈处理的细节;第二题"有效的括号"展示了如何利用栈的特性来判断括号匹配的有效性,包括预处理判断、栈的操作和最终检查等步骤。两题都通过具体的代码实现演示了栈的应用。
2025-11-05 21:11:29
926
原创 C++:哈希表
本文系统介绍了哈希技术的核心概念与实现方法,重点分析了开放定址法的实现逻辑。哈希技术通过哈希函数将任意长度输入转换为固定长度输出,主要应用于快速映射、查找和去重。文章详细阐述了哈希表的核心构成(桶数组、哈希函数、冲突解决机制)、负载因子特性(空间利用率与冲突概率的平衡)以及三种哈希函数设计方法(除法散列法、乘法散列法、全域散列法)。针对开放定址法,深入解析了其线性探测的定位规则和群集现象问题,并通过C++代码示例展示了扩容机制和元素迁移的巧妙实现。最后强调了哈希函数设计和冲突处理方法在实际应用中的重要性,为
2025-11-04 17:52:42
834
原创 C++:红黑树
红黑树是一种自平衡二叉搜索树,通过颜色约束(根黑、红不连续、黑高平衡等规则)确保树保持近似平衡,最坏情况下操作效率为O(log n)。本文介绍了红黑树的核心概念、规则及效率分析,并给出C++模拟实现:节点结构包含键值对、颜色标记及父子指针;插入操作分为空树处理、二叉搜索树插入和平衡调整三个阶段,通过变色或旋转(单旋/双旋)修复违反规则的情况,最终保证红黑树性质。该实现确保高效稳定的增删查改性能。
2025-10-29 21:40:12
323
原创 数据结构算法题:list
本文介绍了三个链表相关问题的高效解法。 排队序列:使用单链表遍历,通过数组模拟后继关系,从队首依次输出编号,复杂度O(n)。 单向链表:基于数组模拟单链表和哈希映射,实现O(1)时间的插入、查询和删除操作。 队列安排:采用双向循环链表和哈希映射,支持左右插入和删除,通过指针调整高效维护队列顺序。 三题均通过数组模拟链表结构,结合哈希优化查找效率,适用于大规模数据操作。
2025-10-24 13:18:07
751
原创 算法中的链表结构
算法竞赛的核心目标是在限制时间和内存内通过所有测试用例,静态链表通过“空间换时间”和“预先分配内存”,完美适配了竞赛对效率、稳定性和简洁性的需求。动态链表的灵活性在竞赛场景中优势有限,反而因开销和风险成为劣势,因此静态实现成为主流选择。
2025-10-22 19:58:52
934
原创 Linux:开发工具
命令模式(Normal mode):控制光标移动,执行字符/字/行的删除、移动复制区段,以及切换到插入模式或末行模式。插入模式(Insert mode):唯一可进行文字输入的模式,按「ESC」键返回命令模式,是最常用的编辑模式。末行模式(last line mode):用于文件保存、退出,还可进行文件替换、查找字符串、列出行号等操作;在命令模式下按「shift+:」进入。vim实际有12种模式,分为6种基础模式(BASIC modes)和6种附加模式(ADDITIONAL modes)。
2025-10-22 14:25:31
579
原创 C++:AVL树
AVL树是最早的自平衡二叉搜索树,由Adelson-Velsky和Landis于1962年提出。它通过平衡因子(右子树高度减左子树高度)控制节点高度差不超过1,确保高效的操作性能(时间复杂度稳定在O(log n))。AVL树的插入操作首先按二叉搜索树规则定位,然后通过旋转调整保持平衡,包括单旋(左/右旋)和双旋(左右/右左旋)四种情况。代码实现使用三叉链表结构(含父指针),便于平衡因子的回溯更新和旋转操作的高效执行。
2025-10-17 10:43:54
817
原创 Linux:权限
Shell 是一个命令解释器,它接收用户输入的命令,解析后调用操作系统内核的功能执行,并返回结果。bash(Linux 系统默认)zsh(功能更丰富,支持更多插件)sh(早期 Unix 标准 Shell)fish(交互友好,自动补全强大)
2025-10-14 08:26:09
844
原创 竞赛算法中的常用库以及库函数
本文总结了C++算法竞赛中常用的三个标准库函数及其核心功能: <string>库:提供字符串操作函数,包括size()/length()获取长度、find()查找子串、substr()截取子串、stoi()字符串转数字、to_string()数字转字符串等。 <algorithm>库:包含排序sort()、查找binary_search()、反转reverse()、统计count()等高效算法,特别适合处理vector等容器数据。 <cmath>库:提供数学计算函数,如a
2025-10-11 22:17:31
772
原创 C++:set_map
摘要 本文详细介绍了C++中的set和map容器,对比了序列容器与关联容器的特性。set是基于红黑树实现的有序集合,元素唯一且不可修改,提供高效的查找(O(log n))。序列容器(如vector、list)按插入顺序存储,支持随机访问,而关联容器(set/map)按键自动排序,适合快速查找。set的接口包括插入(返回插入状态)、删除和查找(count/find)等操作,迭代器为双向不可修改类型。map扩展为键值对存储,unordered系列使用哈希表实现更快(O(1))但无序的访问。两类容器在内存、访问方
2025-10-11 12:50:09
671
原创 Linux:基本指令(二)
通过格式占位符控制输出内容,满足不同场景需求(如日志命名、脚本时间戳)。占位符含义示例输出%Y4位年份2025%m2位月份(01-12)10%d2位日期(01-31)07%H24小时制小时(00-23)14%M分钟(00-59)35%S秒(00-59)22%w星期(0=周日,1=周一)3%F标准日期格式(Y-m-d)2025-10-07%T标准时间格式(H:M:S)14:35:22示例:自定义格式输出。
2025-10-07 20:37:09
773
原创 C++:二叉搜索树
二叉搜索树是一种高效支持查找、插入和删除操作的有序二叉树结构。其核心特点是:任意节点的左子树键值均小于该节点,右子树键值均大于该节点。中序遍历BST会得到严格递增序列。 BST的主要操作包括: 查找:类似二分查找,时间复杂度O(log n) 插入:通过比较键值找到合适位置插入新节点 删除:需维护BST性质,分三种情况处理 实现方式上,C++通常使用指针构建节点结构,提供递归和非递归两种插入方法: 非递归:显式遍历找到插入位置并连接父节点 递归:将插入任务分解到子树,直到找到空位 BST的性能取决于树的平衡性
2025-10-07 13:16:58
959
原创 C++:多态
文章摘要: 本文系统介绍了C++多态的概念与实现。多态分为编译时多态(函数重载/模板)和运行时多态(通过虚函数实现)。实现运行时多态需要满足两个条件:基类指针/引用调用虚函数,且派生类完成虚函数重写。虚函数重写要求函数名、参数列表和返回值完全相同(协变例外)。通过示例代码演示了多态的实际应用,并分析了一个考察虚函数默认参数绑定的易错题。最后简要介绍了协变特性,即派生类虚函数可返回基类虚函数返回类型的派生类型指针/引用。多态机制增强了代码的灵活性和扩展性。
2025-09-29 14:30:33
755
原创 排序和比较算法的常用库函数
本文介绍了C++标准库中常用的排序相关函数及其用法,主要包括:std::sort(快速排序)、std::stable_sort(稳定排序)、std::partial_sort(部分排序)、std::nth_element(查找第n小元素)以及堆操作函数std::make_heap、std::push_heap、std::pop_heap和std::sort_heap。每个函数都配有示例代码、时间复杂度分析和适用场景说明,帮助开发者根据需求选择合适的排序方法。文章以热情活泼的语言风格,鼓励读者在实践中掌握这些
2025-09-25 16:49:35
1037
原创 Linux:基本指令(一)
符号表示:用(斜杠)表示,是 Linux 文件系统的最顶层目录,所有其他目录、文件(包括系统文件、用户文件、配置文件等)都直接或间接包含在根目录下。核心功能:作为整个文件系统的“根节点”,承载系统运行必需的核心目录(如/bin/etc/usr)和所有用户的家目录,是 Linux 系统的“基础骨架”。类比理解:相当于 Windows 系统中的“此电脑”(但逻辑上是单一顶层,而非多磁盘分区分散管理),所有磁盘分区最终都会挂载到根目录下的某个子目录(如/mnt/home根目录(/)
2025-09-24 23:28:10
208
原创 Linux操作系统入门
开源操作系统:源代码完全公开,允许用户自由查看、修改、分发和二次开发,遵循开源协议(如GPL、Apache)。代表:Linux(及各类发行版如Ubuntu、CentOS)、Android(内核开源)、FreeBSD。闭源操作系统:源代码由厂商严格保密,用户仅能使用成品,无修改或查看代码的权限,核心技术由厂商独家控制。代表:微软Windows(客户端/服务器版)、苹果macOS/iOS、Oracle Solaris。
2025-09-14 15:31:45
552
原创 C++:继承
C++继承机制摘要 继承是C++面向对象编程的核心特性,用于实现类之间的层次关系和代码复用。主要特点包括: 关系模型:遵循"is-a"原则(如猫是一种动物),子类继承父类的非私有成员,同时可扩展或修改成员。 访问控制:通过public/protected/private继承方式控制成员可见性,其中public继承最常用。 多态基础:支持方法重写,为运行时多态奠定基础。 继承形式:包括单继承、多继承(需谨慎使用)和类模板继承,可形成多层继承体系。 语法规范:使用"class 子类
2025-09-13 18:13:47
902
原创 C++:模版进阶
文章摘要: 本文深入探讨了C++模板编程的两个重要进阶特性。第一部分介绍了非类型模板参数,通过对比宏定义固定容量栈和模板参数化栈的实现,展示了非类型模板参数在编译期定制化、类型安全和灵活性方面的优势。第二部分详细讲解了模板特化机制,包括全特化和偏特化:全特化针对特定类型组合提供完全定制实现;偏特化则支持部分参数固定或类型特性约束(如指针/引用),为类模板提供更精细的控制。通过多个代码示例,文章清晰呈现了这些高级模板技术的实际应用场景和实现方法。
2025-09-11 22:08:41
763
1
原创 数据结构算法:顺序表
摘要:顺序表相关算法解析 寄包柜问题 需求:动态管理n个柜子的物品存取 解法:使用vector<int> a[N]结构,通过resize()按需扩容 优势:避免静态二维数组内存浪费,支持动态扩展 移动零问题 需求:将数组零元素移至末尾并保持非零元素顺序 解法:双指针法(cur标记非零位,i遍历交换) 时间复杂度:O(n),空间复杂度:O(1) 示例:[0,1,0,3,12] → [1,3,12,0,0] 两题均体现顺序表的核心操作:动态内存管理和元素高效重排。
2025-08-23 19:00:32
734
原创 C++算法竞赛:位运算
本文介绍了位运算的基本概念和实际应用案例。首先讲解了按位与、位移、取反等基础知识,并强调了位移操作的注意事项。随后通过三个典型题目展示了位运算的具体运用:1) 使用按位与判断奇偶性;2) 通过逐位拆解和反向拼接实现二进制位颠倒;3) 通过拆位取反和重组计算数字补数。每个案例均配有详细的分析步骤和C++代码实现,帮助读者理解位运算的高效性和实际应用场景。文章采用图文结合的方式,使抽象概念更直观易懂,适合编程初学者或希望巩固位运算知识的开发者学习参考。
2025-08-17 22:54:23
1033
原创 C++算法竞赛:进制转换
本文详细讲解了C++算法竞赛中的进制转换问题,包括不同进制表示方法(二进制、八进制、十进制、十六进制)及其转换原理。重点介绍了两种核心转换方法:其他进制转十进制通过按位权重展开求和,十进制转其他进制采用除余法倒序拼接。文章提供了递归实现十进制转x进制的代码模板,并分析了其他进制转十进制的模拟计算过程,通过位权累加法实现转换。附带图解和完整代码示例,帮助读者掌握竞赛中快速处理进制问题的技巧。(149字)
2025-08-13 12:13:56
365
原创 C++:stack_queue(2)实现底层
本文摘要: 容器适配器: 本质是封装底层容器(如vector/deque),不直接存储数据 提供特定数据结构的受限接口(如stack的LIFO操作) 不支持迭代器访问,隐藏底层实现细节 实现三种典型适配:stack、queue、priority_queue 双端队列(deque): 分段存储结构,通过map管理内存块 两端操作高效(O(1)),中间操作低效(O(n)) 支持随机访问但性能略逊于vector 内存开销较大,迭代器稳定性差 仿函数: 通过重载operator()实现函数式调用 可保存状态,比普通
2025-08-11 13:02:53
730
原创 Python:文件管理
在计算机中,文件是具有符号名的、在逻辑上具有完整意义的一组相关信息项的有序序列。从代码的角度来看,文件是存储在磁盘或其他存储设备上的数据集合,可以通过编程接口(如 Python 中的open()函数)进行读取和写入操作。文件路径是文件在文件系统中的位置标识,用于准确定位和访问存储设备上的文件。
2025-08-06 22:42:30
950
原创 C++:stack与queue的使用
本文介绍了栈(stack)和队列(queue)两种数据结构的基础知识与应用。栈遵循后进先出(LIFO)原则,通过示例代码演示了push()、pop()和top操作,输出结果为5 4 3 2 1。队列遵循先进先出(FIFO)原则,示例展示了入队(enqueue)和出队(dequeue)操作,输出结果为1 2 3 4 5。两种数据结构分别适用于不同的应用场景,如函数调用栈和任务调度队列。代码示例均使用C++标准库实现,展示了基础操作的用法。
2025-07-29 21:50:55
372
原创 C++:list(2)list的模拟实现
本文分析了顺序表与链表的底层结构差异及实现方式。顺序表使用连续内存空间,通过预分配和位置计算实现高效访问(O(1)),但插入/删除需移动元素;链表采用离散节点和指针连接,支持动态创建无需扩容,插入/删除仅调整指针(O(1)),但访问效率较低(O(n))。代码实现部分展示了双向链表节点的模板化设计(_list_node)和迭代器实现(_list_iterator),后者通过操作符重载提供类似指针的访问方式,支持双向遍历。整个实现体现了STL风格,采用模板泛型、类型别名和轻量级迭代器设计,区分了容器与迭代器的职
2025-07-26 13:17:41
700
原创 C++:list(1)list的使用
本文介绍了C++标准库中std::list容器的使用方法和特性。主要内容包括:1)list的内部结构,采用环状双向链表实现,包含哨兵节点,支持高效的正向和逆向遍历;2)list的基本操作,包括多种初始化方式、插入/删除元素、调整大小等常用成员函数的使用示例;3)进阶操作如splice、remove/remove_if、unique、merge和reverse等特殊功能的实现原理与应用场景。通过代码示例和详细注释,展示了list在数据管理中的灵活性和高效性,特别适合需要频繁插入删除操作的场景。
2025-07-23 21:46:22
909
原创 Python小项目:人生重开模拟器
重启人生模拟器”是一款模拟人生的文字游戏,玩家可以设定角色的初始属性,经历从出生到死亡的一生,期间会遇到各种随机事件,这些事件会影响角色的属性,最终决定角色的人生结局。通过以上步骤,就可以实现一个简单的“重启人生模拟器”游戏。
2025-07-20 11:01:41
699
原创 C++:vector(3)
本文探讨了C++中vector扩容时的深拷贝问题和二维vector的使用。在vector扩容时,使用memcpy会导致浅拷贝问题,特别是对于包含指针的对象(如std::string),新老对象会共享同一内存资源。改进方法是采用赋值操作替代memcpy,确保调用对象的赋值运算符实现深拷贝。以杨辉三角生成为例,展示了二维vector的典型应用,通过动态规划方法逐行计算元素值,其中初始化每行大小并默认填充1,再根据杨辉三角特性递推中间元素。正确处理vector扩容和二维vector操作对C++编程至关重要。
2025-07-18 19:36:25
663
原创 C++:vector(2)之vector的模拟实现
本文展示了自定义 vector 类的核心实现,包含: 内存管理:通过 _start、_finish、_endofstorage 三个指针标记数据范围与容量边界,析构时自动释放内存; 迭代器支持:定义 iterator 和 const_iterator 类型,提供 begin()/end() 接口; 关键功能:实现 size()、capacity()、empty() 等基础查询,以及 reserve() 内存扩容(使用深拷贝避免浅拷贝问题); 构造扩展:支持初始化列表和迭代器范围构造。
2025-07-16 21:26:03
950
原创 C++:vector(1)
本文介绍了C++标准库中vector容器的基本使用方法和特性。主要内容包括:1) vector的成员函数分类,涵盖构造、析构、赋值等操作;2) 元素访问方法如operator[]、at()等;3) 修改操作包括push_back、insert、erase等;4) 容量管理相关函数如size()、resize()等。通过示例代码演示了vector的初始化、遍历、插入删除等操作,并对比了emplace_back和push_back的性能差异。特别指出emplace_back可以直接在容器尾部构造对象,避免额外拷
2025-07-11 20:50:55
560
原创 C++: string 类习题讲解
本文讲解了五道C++字符串处理题目: 首个唯一字符:统计字符频率后二次遍历,返回第一个频率为1的字符索引。 验证回文串:过滤非字母数字字符并转为小写,判断反转后是否与原串相同。 反转字符串:使用双指针原地交换字符实现O(1)空间复杂度反转。 字符串转整数:处理前导空格、符号位后逐位转换,需处理溢出情况。 字符串相加(摘要未完整):模拟竖式加法,从末位逐位相加处理进位。 所有解法均通过标准库函数和高效算法实现,涵盖频率统计、双指针、溢出处理等核心技巧。
2025-07-11 13:41:38
1215
原创 C++:string类(3)(string类的模拟实现)
获取迭代器 it 遍历;依托 <string.h> 等头文件,于 yl 命名空间内定义 string 类,通过 typedef 构建迭代器,并声明 begin 、 end 等函数,逐步搭建字符顺序表的实现架构,以此开启对字符串容器手动模拟的实践,深入探寻STL容器实现的底层逻辑。实现 substr 函数,处理两种长度情况,先确定要截取的有效长度,创建新 string 对象,扩容后逐个字符拷贝,把原字符串指定位置和长度的子串提取出来返回,让自定义 string 类具备了截取子串的能力。
2025-07-07 22:30:41
812
原创 C++:string类(2)
以上代码演示 C++ string 三类追加操作: += 灵活拼接字符串/字符, push_back 专一追加单个字符, append 针对性扩展字符串。通过 test01 函数里的 s1 s2 s3 实例,直观展现不同接口的用法差异,看输出就能秒懂它们在字符串扩展时的具体表现。(注:本文承接《C++:string类(1)》的内容)1string类对象的修改操作。一.string类的常用接口。1.2字符串的增删改。
2025-07-04 19:35:02
145
原创 C++:string类(1)
输出验证构造结果后,展示赋值操作: s1 先赋 s2 值,再赋字符串字面量 "xyz" ,最后赋字符 'c' ,完整呈现 string 类灵活的初始化与赋值能力,借助 VS 调试窗口输出结果,直观体现代码逻辑执行效果。定义了 my_string 类,私有成员包含动态字符指针 a ,以及记录长度的 size 和容量的 capacity ,为后续实现字符串的动态管理(如内存分配、扩容等)奠定基础,这些成员是构建自定义字符串类的核心要素。,是C++标准库的重要组成部分。
2025-06-27 17:37:24
678
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅