自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++编程基础(九):预处理指令

C++预处理是在编译前进行的文本替换处理,主要包括文件包含、宏定义和条件编译三大功能。文件包含通过#include指令将头文件内容插入源文件,常用#ifndef或#pragma once防止重复包含。宏定义使用#define进行文本替换,分为无参宏和带参宏,需注意加括号避免运算错误。条件编译通过#if/#ifdef等指令实现代码选择性编译,常用于跨平台和调试场景。预处理器还提供__FILE__、__LINE__等内置宏用于调试。现代C++推荐用constexpr和inline替代部分宏功能以提高安全性。

2025-11-27 16:00:00 490

原创 数组——模拟:66.加一

摘要 题目要求将一个整数数组表示的数字加1并返回结果数组。主要处理三种情况:1)末位非9直接加1;2)末尾有多个9时,找到第一个非9位加1并将后续位归零;3)全为9时新建首位为1、其余为0的数组。通过逆序遍历实现,时间复杂度O(n),空间复杂度O(1)。优化版代码通过即时处理进位使逻辑更简洁。

2025-11-25 21:21:13 131

原创 C++编程基础(八):自定义数据类型

摘要:本文介绍了C++中三种重要的复合数据类型。结构体(Struct)支持数据与函数的封装,提供了定义、初始化、指针访问和参数传递方式(包含性能优化建议)。共用体(Union)通过共享内存实现不同类型数据存储,但同一时间只能使用一个成员。枚举类型(Enum)包含传统C风格枚举和更安全的C++11强类型枚举(enum class)。最后讲解了类型别名的两种实现方式(typedef与using),并指出指针别名的const陷阱。这些内容涵盖了C++复合数据类型的主要知识点和使用技巧。

2025-11-18 16:05:50 889

原创 数据结构入门 (十一):“自我平衡”的艺术 —— 详解AVL树

摘要: AVL树是一种自平衡二叉搜索树,通过平衡因子(BF=左子树高度-右子树高度)确保任意节点BF绝对值不超过1。当插入或删除导致失衡(BF=±2)时,通过四种旋转操作调整: LL型(右旋) RR型(左旋) LR型(先左旋后右旋) RL型(先右旋后左旋) C语言实现中,节点需存储高度,递归插入时动态计算BF并触发旋转,维持操作复杂度为O(log n),避免BST退化为链表的性能问题。

2025-11-15 21:02:04 903

原创 C++编程基础(七):指针

本文介绍了C++指针的核心概念与应用。首先解释了指针的本质是内存地址,以及指针变量的定义和使用方法(&取地址、*解引用)。然后详细讨论了特殊指针类型:空指针(推荐使用nullptr)和void指针(需类型转换)。重点解析了const与指针的三种组合形式,区分了指向常量的指针、指针常量和指向常量的指针常量。最后展示了指针的常见应用场景:通过指针算术操作数组、处理C风格字符串(注意字符串字面量的const安全),以及指针作为函数参数和返回值时的注意事项(避免返回局部变量地址)。全文通过代码示例清晰地阐述

2025-11-14 15:16:52 677

原创 数据结构入门 (十):“左小右大”的秩序 —— 深入二叉搜索树

二叉搜索树(BST)是一种高效的数据结构,通过"左小右大"的规则实现有序性,支持平均O(log n)时间的查找、插入和删除操作。文章详细介绍了BST的递归实现,包括节点结构设计、插入操作的递归处理、中序遍历的有序输出、非递归查找的二分逻辑、树高计算以及删除节点的三种情况处理(叶子节点、单子节点和双子节点时的前驱/后继替换策略)。BST巧妙结合了二分查找的高效性和链表的灵活性,是平衡二叉搜索树等更高级结构的基础。

2025-11-11 17:35:43 873

原创 C++编程基础(六):函数

C++函数是程序的基本构建单元,分为库函数和用户自定义函数。函数定义包含返回类型、函数名、参数列表和函数体;声明则仅需函数原型。参数传递有三种方式:传值(安全但低效)、传引用(高效可修改实参)和传指针。函数支持默认参数和C风格可变参数,但只能返回单一值。函数重载允许同名函数依据参数列表区分,但不支持仅返回类型不同的重载。递归函数需满足基准条件和递归逼近条件,如斐波那契数列和汉诺塔问题的实现。合理使用函数能提高代码重用性、可读性和模块化程度。

2025-11-06 21:31:55 639

原创 数组——定长滑动窗口:1343. 大小为 K 且平均值大于等于阈值的子数组数目

题目要求统计数组中长度为k的子数组,其平均值大于等于给定阈值threshold的数量。采用滑动窗口方法,维护一个长度为k的窗口和窗口内元素的和sum。遍历数组时,当窗口填满后,检查sum/k是否满足条件并计数,然后滑动窗口移除最左元素。该方法的时间复杂度为O(n),空间复杂度O(1),高效地解决了问题。

2025-11-03 16:00:00 206

原创 数组——定长滑动窗口:643. 子数组最大平均数 I

摘要:本文解决LeetCode 643题,求长度为k的连续子数组最大平均数。提供两种滑动窗口解法:思路1先累加元素并更新最大值,思路2先计算前k个元素和再滑动窗口优化。两种方法均为O(n)时间复杂度,需注意结果需转换为double类型避免整数除法误差。代码演示了两种实现方式,并强调负数情况下的初始化处理。

2025-11-02 17:04:15 206

原创 字符串——定长滑动窗口:1456. 定长子串中元音的最大数目

题目要求找出字符串中长度为k的子串最多包含多少个元音字母。 解题思路采用滑动窗口法,通过维护一个动态窗口来优化计算效率。初始化两个变量ans和vowel分别记录最大元音数和当前窗口元音数。遍历字符串时,若当前字符是元音则增加vowel。当窗口完整出现时,更新ans最大值,并判断窗口左移的字符是否为元音以相应减少vowel。 该方法避免了重复计算,将时间复杂度从O(nk)优化至O(n),显著提升了效率。

2025-10-28 21:47:20 323

原创 C++编程基础(五):字符数组和字符串

本文介绍了C++中两种处理文本数据的方式:C风格字符串字符数组和std::string类。C风格字符串以'\0'结尾,存在安全性问题,需注意空间分配和指针操作。文章详细讲解了其定义、初始化、输入输出及常用字符串函数。相比之下,std::string类更安全易用,提供了丰富的成员函数,包括构造、访问、修改、查找等操作。现代C++编程推荐优先使用std::string,它不仅简化了字符串处理,还避免了C风格字符串的常见陷阱。

2025-10-26 21:52:42 736

原创 2566. 替换一个数字后的最大差值

最大值的构造:从左到右找到第一个不是'9'的字符,将其以及所有相同的数字替换为'9',这样可以在保证数值最大的前提下,提升整体数值。最小值的构造:将最高位的数字替换为'0'(即使其他位也可能是'0',但只替换最高位即可),这样可以最大程度地降低数值。

2025-10-25 00:03:35 325

原创 C++编程基础(四):一维数组和二维数组

本文介绍了C++中数组的基础知识及常用操作。首先讲解了一维数组的定义、初始化与遍历方法,强调数组索引从0开始且长度需在编译期确定。其次探讨了数组与指针的关系,包括指针运算和标准库函数begin/end的使用。最后详细介绍了数组的常用操作:线性查找和二分查找算法、通过下标修改元素的方法,以及如何在固定大小数组中模拟插入操作。文章还提供了多个实用代码示例,如查找极值、插入元素等,展示了C风格数组的基本应用。

2025-10-23 16:53:54 635

原创 数组——双指针:75.颜色分类

摘要: 本文针对颜色分类问题(LeetCode 75题),提出三种原地排序方法。 单指针法:两次遍历,分别将0和1交换到数组头部,时间复杂度O(n),空间复杂度O(1)。 双指针法:单次遍历,通过p0和p1指针分别处理0和1,需注意p0<p1时的交换逻辑,时间复杂度O(n)。 双指针升级版:分置p0和p2于首尾,处理0和2,确保2被交换至尾部后不遗漏,时间复杂度O(n)。 三种方法均满足原地操作要求,空间复杂度为O(1),适用于限制条件下的排序需求。

2025-10-22 21:26:20 660

原创 数据结构入门 (九):线索的“寻路”指引 —— 详解线索二叉树

摘要 本文探讨了二叉树的性能优化问题,提出利用空指针域构建线索二叉树以解决遍历时频繁查找前驱/后继的低效问题。通过引入lTag和rTag标志位区分孩子指针与线索指针,实现了中序线索化算法。C语言实现包含节点创建、线索化及非递归遍历,利用全局变量pre动态维护前驱节点,显著提升了遍历效率(无需栈辅助)。最后指出线索二叉树的释放需谨慎处理线索指针,避免误释放。该设计巧妙平衡了空间利用率与时间复杂度,适用于高频前驱/后继查询场景。

2025-10-17 21:45:59 986

原创 C++编程基础(三):程序流程控制结构

C++程序控制结构主要包括三大类:顺序控制、分支控制和循环控制。分支控制通过if语句(单分支、双分支、多分支及嵌套)和switch语句实现条件判断;循环控制则通过while、do-while和for循环(含C++11范围for循环)实现重复执行。此外,跳转语句break和continue可中断正常流程。这些结构是构建复杂程序逻辑的基础,现代C++特性如带初始化的if语句和范围for循环使代码更简洁安全。

2025-10-15 16:46:20 808

原创 数组——贪心:122.买卖股票的最佳时机 II

摘要 该问题要求在股票交易中获取最大利润,最多持有一股。通过贪心算法,遍历价格数组,只要后一天价格高于前一天,就将差值作为利润累加。最终将所有连续上涨段的利润总和即为最大利润。时间复杂度O(n),空间复杂度O(1)。

2025-10-14 21:30:00 319

原创 数据结构入门 (八):寻访节点的“路线图” —— 二叉树的深度与广度遍历

本文介绍了二叉树的两种基本遍历方法:深度优先遍历(DFS)和广度优先遍历(BFS)。DFS采用递归实现,包括先序、中序和后序三种方式,分别对应不同的节点访问顺序。BFS则采用队列实现,按层次逐层访问节点。文章通过C语言代码展示了二叉树的结构定义和遍历算法的具体实现,包括递归版本的DFS和非递归版本的BFS。这些遍历方法是操作树结构的基础,在文件系统、数据库索引等场景中有广泛应用。

2025-10-14 16:10:08 841

原创 C++编程基础(二):运算符与类型转换

C++运算符详解:本文系统介绍了C++中常用的运算符类型,包括算术运算符(+,-,*,/,%等)、关系运算符(==,!=,>,<等)、逻辑运算符(&&,||,!)、成员访问运算符(.,->)、条件运算符(?:)以及位运算符(&,|,^,~,<<,>>)。内容涵盖运算符的语法、功能说明、使用示例和运算结果,并配有运算符优先级表。运算符是C++程序执行计算和逻辑操作的基础工具,掌握各类运算符的使用对编写高效代码至关重要。

2025-10-12 15:00:00 820

原创 数据结构入门 (七):从“链接”到“分支” —— 初探树与二叉树

本文系统介绍了树结构的基本概念、存储方式及其核心特性。首先阐述了树的定义与递归特性,并解释了节点、根、父节点等基本术语。接着详细分析了三种树的存储结构:双亲表示法、孩子表示法和孩子兄弟表示法。重点探讨了二叉树这一特殊形态,包括其五种结构、满二叉树与完全二叉树的定义差异,以及二叉树的五大性质。最后指出树结构的动态操作(遍历、查找等)将是后续学习重点,为理解非线性数据结构奠定了理论基础。全文层次清晰,从静态结构到动态应用逐步深入,适合数据结构初学者系统学习。

2025-10-10 21:21:31 951

原创 C++ 编程基础(一):变量、数据类型与作用域

在 C++ 编程中,有时我们会遇到非常长或复杂的类型声明,这些类型不仅难写,而且降低了代码的可读性。​auto 关键字用于进行类型推导,让编译器根据初始化表达式自动确定变量的类型,它不是类型别名。一旦绑定,引用和原变量共享同一块内存,对引用的所有操作都是在与之绑定的对象上进行的。结构体是一种用户自定义的复合类型,用于将不同类型的数据组合在一起。的元素的集合,存储在连续的内存中。大小等于最大成员的大小。会表现为带符号的和无符号中的一种,具体由编译器决定。,分别用于输出缓冲的日志信息和非缓冲的错误信息。

2025-10-09 23:46:27 595

原创 数组——双指针:80.删除有序数组中的重复项 II

摘要 题目要求删除有序数组中重复超过两次的元素,返回新数组长度。采用双指针法,快指针遍历数组,慢指针标记写入位置。初始两个元素无需处理。当快指针元素不等于慢指针前两个元素时,说明未超过两重复,将元素写入慢指针位置。时间复杂度O(n),空间复杂度O(1)。

2025-10-06 23:11:52 175

原创 数组——双指针:26.删除排序数组中的重复项

本文介绍了如何用双指针法删除有序数组中的重复项。快指针遍历数组,慢指针记录不重复元素的位置。当快指针发现新元素时,将其复制到慢指针位置并移动慢指针。最终慢指针即表示去重后的数组长度。这种方法时间复杂度O(n),空间复杂度O(1),高效地实现了原地修改。

2025-10-05 21:09:12 153

原创 数组——双指针:27.移除元素

摘要 该问题要求在O(1)空间复杂度下移除数组中等于val的元素。采用双指针法:快指针遍历数组,慢指针标记有效元素位置。当快指针遇到非val元素时,将其复制到慢指针位置并移动慢指针。最终返回慢指针位置即为新数组长度。时间复杂度O(n),空间复杂度O(1)。

2025-10-05 12:49:15 122

原创 数据结构入门 (六):公平的艺术 —— 深入理解队列

摘要:队列数据结构详解 本文系统介绍了队列数据结构的原理与实现。队列作为遵循"先进先出"(FIFO)原则的受限线性表,在队尾插入、队头删除元素。文章首先分析了顺序队列的"假溢出"问题及解决方案,重点讲解了循环队列的实现机制,包括判空判满条件和C语言实现。随后介绍了链式队列的无限扩展特性及其实现方式,包含结构定义、创建、入队出队等核心操作。通过对比顺序和链式两种存储结构,展示了各自适用场景,为读者理解队列在任务调度、消息缓冲等领域的应用提供了技术基础。

2025-10-05 11:24:05 615

原创 数组——双指针:283.移动零

本文介绍了LeetCode 283题"移动零"的解题思路。题目要求将数组中的零元素全部移动到末尾,同时保持非零元素的原始顺序。采用双指针法,使用快慢指针遍历数组:快指针寻找非零元素,当发现非零元素时与慢指针位置交换,确保所有非零元素逐步前移。这种方法时间复杂度O(n),空间复杂度O(1),在原数组上完成操作,满足题目要求。

2025-10-04 00:18:17 117

原创 数据结构入门 (五):约束即是力量 —— 深入理解栈

本文介绍了栈这种LIFO(后进先出)数据结构及其实现方式。首先通过线性表引入栈的概念,说明栈是操作受限的线性表,只能在表的一端(栈顶)进行插入和删除操作。文章重点阐述了两种栈的实现:顺序栈(基于数组)和链式栈(基于链表)。对于顺序栈,详细分析了四种设计模式(递增/递减×空/满栈)及其C语言实现,包括初始化、压栈、弹栈等操作。对于链式栈,则说明其优势在于不会溢出,并给出链表头作为栈顶的实现思路。最后提供了链式栈的C语言实现代码框架,包括创建栈和压栈操作的实现。

2025-09-30 21:19:05 1110

原创 数据结构入门 (四):双向通行的“高速公路” —— 深入双向循环链表

本文介绍了双向循环链表的实现原理和C语言实现。首先分析了单向链表的局限性,提出双向链表的优势。重点讲解了双向链表的节点插入和删除操作,通过图示详细展示了4步插入法和2步删除法的核心逻辑。然后介绍了带头节点的双向循环链表结构,说明了其头插和尾插的统一性。最后给出了完整的C语言实现代码,包括结构体定义、初始化函数、核心辅助函数以及头插尾插操作。双向循环链表通过前后指针实现了高效的双向遍历,是工程中最常用的链表结构之一。

2025-09-28 17:34:23 784

原创 数据结构入门 (三):链表的时空博弈 —— 循环链表与哑节点详解

摘要:链表的时空优化策略 本文探讨了链表在空间和时间效率上的优化方法。针对带头节点的单向链表存在空间浪费的问题,提出了使用带头指针链表的解决方案,并巧妙引入临时dummy节点实现代码统一性。同时,为优化时间效率,分析了单向循环链表的优势,指出其能有效降低访问表尾节点的时间复杂度。文章详细展示了带头指针链表的完整实现,包括初始化、插入、删除等核心操作,并通过测试验证了其正确性。这些优化策略展示了数据结构设计中“空间换时间”和“时间换空间”的经典权衡思想。

2025-09-27 15:01:21 971

原创 数组——哈希表:217.存在重复元素

摘要:本文介绍了3种判断数组中是否存在重复元素的方法。1)哈希集合去重法:通过比较原数组和集合的大小判断;2)遍历插入法:边遍历边插入集合,发现重复立即返回;3)排序法:排序后检查相邻元素。方法1、2的时间复杂度为O(n),空间复杂度O(n);方法3时间复杂度O(nlogn)。哈希集合相关的操作如find()、insert()等也进行了说明。三种方法从不同角度解决了重复元素检测问题。

2025-07-19 22:42:07 150

原创 数组:189.轮转数组

本文介绍了三种旋转数组的方法:1)临时数组法:通过创建临时数组存储移动后的元素,时间复杂度O(n),空间复杂度O(n);2)三次反转法:先整体反转数组,再分别反转前k个和剩余元素,时间O(n),空间O(1);3)环形替换法:通过循环将元素逐个移动到正确位置,处理所有循环,时间O(n),空间O(1)。其中三次反转法和环形替换法都是原地操作,空间效率更优。

2025-07-18 14:03:25 561

原创 数据结构入门 (二):挣脱连续空间的束缚 —— 单向链表详解

文章摘要:从顺序表到链表的演进 本文探讨了顺序表的局限性及其解决方案——链表的引入。顺序表虽然具有随机访问高效等优点,但其对连续空间的高要求和插入删除的高成本成为主要痛点。链表通过解耦逻辑顺序与物理存储,采用节点结构(数据域+指针域)实现灵活存储。文章详细比较了头指针与头节点的区别,推荐使用带头节点的链表以简化操作。核心内容涵盖链表结构的定义、创建、遍历和插入操作(特别是头插法),通过图示和代码示例展示了链表的优势——空间利用率高且插入时间复杂度为O(1)。链表为解决顺序表的空间碎片问题提供了优雅方案。

2025-07-17 18:13:06 1173

原创 数据库核心概念 (二):关系模型精解——结构、操作与完整性

本文系统性地阐述了关系数据库的核心概念与结构。主要内容包括:(1)关系模型的三大要素——数据结构(二维表)、数据操作(封闭性、非过程性)和完整性约束;(2)关系的数学定义,包括域、笛卡尔积及其在数据库中的实际应用;(3)关键概念对比,如候选键、主键、外键和超键的区别;(4)关系的基本类型(基本表、查询表和视图)及其特性;(5)关系数据库的组成结构与存储实现方式,强调逻辑存储与物理存储的差异。文章通过图表、公式和示例,清晰地呈现了关系数据库的理论基础与实践应用。

2025-06-22 17:05:20 1066

原创 一图看懂数据分布:箱线图完全解析

摘要: 箱线图是一种高效的数据可视化工具,通过“五数概括法”(最小值、Q1、中位数、Q3、最大值)和异常值检测,直观展示数据的分布特征。它能揭示数据的中心趋势(中位数)、离散程度(IQR和胡须长度)、偏态(对称或倾斜)以及异常值(离散点)。箱线图特别适用于多组数据的快速对比,例如分析不同群体的成绩分布。通过计算四分位距和边界,可以轻松识别数据中的离群值。简言之,箱线图是数据探索的“X光片”,帮助用户快速洞察数据全貌。

2025-06-16 15:30:00 2078

原创 假设检验:统计推断的决策艺术

假设检验是统计学中通过数据对总体参数主张进行科学判断的方法。文章系统介绍了假设检验的基本原理、两类错误、单双正态总体参数检验及P值应用。主要内容包括:1)假设检验框架(原假设与备择假设);2)Ⅰ类错误(α)与Ⅱ类错误(β)的权衡关系;3)单总体均值与方差检验(Z检验、t检验、卡方检验);4)双总体均值差与方差比检验;5)P值的定义与决策规则。强调P值不应被误解为假设成立的概率,而是观测到极端数据的概率。文章通过流程图和表格直观展示了各类检验的适用条件和拒绝域。

2025-06-14 15:00:00 1770

原创 参数估计:从样本窥见总体

本文系统介绍了参数估计的理论与方法,主要包括点估计和区间估计两大内容。在点估计部分,重点讲解了矩估计法和最大似然估计两种方法,并分析了估计量的无偏性、有效性等评价标准。区间估计部分则详细阐述了置信区间的构建原理,针对单双正态总体分别给出均值、方差、均值差和方差比的区间估计公式,同时介绍了单侧置信区间的应用场景。全文通过表格、流程图等形式直观展现了参数估计的核心概念和计算方法,为统计推断提供了系统的理论基础。

2025-06-14 10:00:00 705

原创 样本与抽样分布:统计推断的基石

本文系统介绍了统计推断中的样本与抽样分布理论。首先定义了总体、样本和统计量等核心概念,重点说明了样本方差的无偏性证明。接着详细阐述了三大抽样分布(χ²分布、t分布和F分布)的定义和性质。最后总结了单正态总体与双正态总体情形下的抽样分布定理,包括样本均值、方差及其比值的分布规律。这些理论为参数估计和假设检验奠定了重要基础,通过抽样分布这一"望远镜"实现了从样本到总体的统计推断。

2025-06-13 15:00:00 1232

原创 大数定律与中心极限定理:概率论的双子星

摘要:大数定律和中心极限定理是概率论的两大核心成果,揭示了随机现象的规律性。大数定律表明,在独立同分布条件下,样本均值依概率收敛于总体期望(辛钦、伯努利、切比雪夫大数定律);中心极限定理则指出,独立随机变量和的标准化形式趋于正态分布(独立同分布、李雅普诺夫、棣莫弗-拉普拉斯定理)。前者描述频率稳定性,后者提供分布形态,二者共同为统计推断奠定理论基础。大数定律强调"量变到质变",中心极限定理体现"无序中的有序",是连接概率与统计的关键桥梁。

2025-06-13 10:00:00 1279

原创 随机变量的数字特征:量化随机现象的核心指标

本文系统介绍了随机变量的核心数字特征及其应用。主要内容包括:1) 数学期望的定义与计算方法,强调其作为分布中心位置的意义;2) 方差作为离散程度度量,给出常见分布的期望方差公式;3) 协方差与相关系数的概念,阐明相关性与独立性的区别;4) 高阶矩对分布形态的描述作用;5) 协方差矩阵在多维分析中的应用。文章还通过切比雪夫不等式展示了方差的实际应用价值。这些数字特征共同构成了分析随机现象的基础工具,为概率统计的实际应用提供了量化依据。

2025-06-12 15:00:00 963

原创 多维随机变量及其分布:探索随机现象的关联性

本文介绍了多维随机变量的核心概念及其分布分析方法。主要内容包括:1) 多维随机变量的定义与分类;2) 联合分布函数的性质;3) 离散型与连续型随机变量的联合分布、边缘分布及其计算方法;4) 条件分布的定义与推导;5) 随机变量独立性的判别标准;6) 两个随机变量函数的分布求解方法,包括Z=X+Y、Z=XY、Z=min/max(X,Y)等常见形式。通过学习可以掌握多维随机变量的联合分析思维,以及边缘分布与条件分布的转换技巧。

2025-06-12 10:00:00 1037

空空如也

空空如也

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

TA关注的人

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