自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 前缀和算法——看这个就够了

本文介绍了前缀和算法的核心思想及其在一维和二维数组中的应用。通过牛客网和LeetCode的例题,详细讲解了前缀和的构建公式(如s[n] = s[n-1] + a[n])和区间求和技巧(s[right]-s[left-1])。针对二维情况,推导了s[i][j] = a[i][j] + s[i-1][j] + s[i][j-1] - s[i-1][j-1]的递推式,并给出矩形区域和的求解方法。文章还通过LeetCode真题,展示了如何将实际问题转化为前缀和模型,特别强调了下标处理防止越界的方法。

2026-07-24 12:42:41 6806 14

原创 二分算法——从原理到精通

本文介绍了二分算法的核心概念与应用,重点讲解了二段性原理及其在二分查找中的作用。通过LeetCode经典题目704和34为例,详细分析了朴素二分算法及其两种改进模板(查找左端点和右端点)的实现细节与适用场景。文章还探讨了中间值计算方式的选择、循环条件的设定以及时间复杂度分析(O(logn)),并通过69、852、153等题目展示了不同模板的实际应用。最后强调模板选择需根据问题的二段性特征决定,为读者提供了完整的二分算法学习框架。

2026-07-17 00:19:00 993 20

原创 异常、RAII和智能指针

RAII?异常?智能指针?一头雾水,快到碗里来!!!

2026-07-12 23:11:12 283 12

原创 万字解析带你吃透c++11——新特性、新语法

本文全面介绍了C++11的核心新特性,主要内容包括:列表初始化:统一初始化语法,支持万物列表初始化右值引用和移动语义:详细解析右值概念、移动构造/赋值、完美转发机制新关键字:可变参数模板实现泛型编程using替代typedefdecltype精确类型推导default/delete控制默认函数final/override管理继承体系nullptr取代NULLemplace系列接口优化容器插入性能lambda表达式和包装器(function/bind)实现灵活回调

2026-07-08 23:19:15 276 18

原创 哈希——数据分类存储柜

哈希表(桶)(Hash Table)又称散列表,是一种基于键值对(Key-Value)存储的线性数据结构,依托哈希函数建立关键字与存储地址之间的映射关系,实现数据的高效存取。什么意思呢?我在前面学习了诸多的数据存储的容器比如vector,我要按值查找/删除一个元素时就必须要遍历整个vector将这个素找到,时间复杂度为O(1),每次查找/删除都要浪费大量的时间。若将 vector 比作丢三落四、毫无条理的家人衣橱:衣物随意堆放,想要找到某件衣服时,只能逐层逐件逐一翻找核对;

2026-07-06 00:13:49 319 10

原创 红黑树插入与调整

红黑树(Red-Black Tree)是一类,由鲁道夫・拜尔于 1972 年提出,后经利奥尼达斯・吉巴斯与罗伯特・塞奇威克完善命名与理论体系。作为计算机科学中经典的动态有序数据结构,它在二叉搜索树(BST)的基础上引入与严格约束规则,通过颜色修正、左旋、右旋三类基础操作实现动态平衡,有效规避了普通二叉搜索树在极端插入、删除场景下退化为线性链表的缺陷。红黑树对树中节点定义基于上述约束,含n个有效节点的红黑树,其树高上界为 2log2​(n+1)。这一有界树高特性决定了其。

2026-06-29 17:07:38 284 3

原创 剑起霜华——平衡二叉树(AVL树 )精讲

AVL树是基于二叉搜索树规定相关的插入、删除方式实现的一种高效的二叉搜索树,通过引入平衡因子和旋转的概念,使得整棵树趋于满二叉树,这样大大提高了查找效率(时间复杂度logN)。AVL树的特点:1.每一个节点的左子树上的所有节点小于该节点存储的数据,右子树上所有节点存储的数据都大于该节点。(大小关系也可取完全相反:“左大右小”)2.中序遍历整棵树得到的数据是有序的3.每个节点的左右子树的高度差不超过14.每个节点都有自己的平衡因子,平衡因子的计算方式是:右子树高度-左子树高度。

2026-06-13 19:00:09 218 4

原创 IO全家桶——C++输入输出

本文系统梳理了C++ IO流的核心知识体系,主要内容包括: IO流类继承体系 上层流体系:格式化流(ios_base/ios)、输入输出基类(istream/ostream)、标准流对象(cin/cout) 文件流(ifstream/ofstream)和字符串流(istringstream/ostringstream)的特化实现 底层缓冲体系(streambuf及其派生类)的运作机制 流状态管理 四种状态标志位(goodbit/badbit/eofbit/failbit)及其检测恢复方法 缓冲区管理函数(c

2026-06-07 21:56:26 226 8

原创 二叉搜索双壁——map和set

本文系统介绍了C++ STL中的关联容器map和set及其衍生版本multimap/multiset。主要内容包括: 核心特性: set:存储唯一key的有序集合,自动去重和排序 map:存储键值对(key-value),key唯一且有序 底层均采用红黑树实现,保证高效查找(O(logN)) 关键操作: 构造方式:默认构造、迭代器区间构造、拷贝构造 插入:insert()方法及其返回值特性 查找:find()/count()/lower_bound()等定位方法 删除:erase()按值/迭代器/区间删除

2026-05-31 17:30:01 239 4

原创 藤萝垂序——二叉搜索树

二叉搜索树是一种特殊的二叉树结构,具有左子树节点值小于根节点、右子树节点值大于根节点的性质。文章介绍了二叉搜索树的基本概念、代码架构及其核心接口的实现方法: 插入操作:通过前后指针遍历找到合适位置,根据节点值大小决定插入左/右子树 查找操作:从根节点开始比较,递归搜索左/右子树直到找到目标值 删除操作:分三种情况处理: 无子节点:直接删除 单子节点:用子节点替代 双子节点:用右子树最小节点或左子树最大节点替代后删除 文章通过代码示例展示了各操作的具体实现,并强调了二叉搜索树不支持直接修改节点值的特性。删除操

2026-05-28 21:43:53 243 1

原创 C++模板特化:类型与常量的灵活掌控

本文介绍了C++模板编程中的关键概念:非类型模板参数和模板特化。非类型模板参数允许在模板中使用常量值,增强了代码灵活性。函数模板特化针对特定类型提供定制实现,但通常可直接定义重载函数替代。类模板特化分为全特化和半特化,前者完全指定所有参数类型,后者部分指定。文章通过数组容器和比较函数的示例,展示了模板特化的实际应用场景和语法规则,帮助读者理解如何利用模板特化处理特殊需求。

2026-05-24 22:36:26 385 1

原创 一网打尽容器适配器——栈、队列和优先级队列

栈和队列数据取入相关示意图: 相关使用接口代码演示: 运行结果:值得注意的是stack和queue都不支持迭代器区间构造。 那么stack,queue的底层改装容器deque是什么为了引入deque,我们先来看一下vector和list的优缺点:我们可以看到vector和list的优缺点是互补的,在两者基础之上,人们引入deque,是在list和vector的基础上的改良,支持头插尾插,头删尾删。改良的具体细节:将list中的一个个节点结构改为一组组数组结构(buff),优化相关方法。deque:的成

2026-05-24 08:56:58 520

原创 代码复用的皇冠——继承和多态

在上述代码中我们可以看到每一个类中都存在一个myswap函数,这样的操作要是放在同一作用域下会因为重定义而编译报错,然而在基类和派生类之中,或者派生类和派生类中,可以重定义这样一个同名的成员,这样我们使用派生类中的同名函数时,就不会调用基类的同名函数了,(同名变量也是如此)也就是说派生类中基类部分的同名成员被隐藏了。

2026-05-22 14:18:04 382 5

原创 秩序之舞——排序算法中的数字星河

本文系统梳理了计算机科学中最基础的八大排序算法:冒泡排序(含鸡尾酒排序优化)、插入排序、希尔排序、选择排序、堆排序、归并排序、快速排序(含多种实现方式)和计数排序。通过生活化场景类比和可视化图解,详细解析了各算法的核心思想、代码实现(C语言)、时间复杂度及稳定性特点。特别强调了不同算法在最优/最差情况下的性能差异,以及快速排序的多种优化策略(三数取中、小区间优化等)。文章最后用表格对比了八大排序的时间/空间复杂度及稳定性,指出稳定排序的关键在于避免远距离交换。这些经典排序算法不仅是编程基础,更是理解算法设计

2026-05-05 16:03:56 437 9

原创 C语言堆——数据结构与算法

堆本质是,我们把它想象成一个。

2026-04-27 23:40:55 634 7

原创 C++vector实用方法讲解和模拟实现

本文介绍了C++中vector容器的基本概念和使用方法。vector是一个支持自动扩容的动态数组,通过生动比喻(如快递箱、水果篮等)解释了其特性。文章详细讲解了vector的创建方式(一维/二维数组)、容量操作(size/capacity/resize等)、元素访问([]运算符重载)以及增删操作(push_back/insert/erase等),并提供了相关方法的模拟实现代码。特别强调了迭代器失效问题,指出在insert和erase操作后必须更新迭代器。通过代码示例展示了vector的基本操作流程,包括遍历

2026-04-19 18:03:57 489 2

原创 C++ string 实用方法讲解,模拟代码实现

上面的代码我们看到 string中有三个成员变量_str,_capacity,_size,分别表示存储字符串的指针,最大存储字符的个数,当前存储有效字符的个数。待转换字符的进制(此参数仅仅存在与stoi,stol):0(自动推导),2,16,10,8。存储返回第一个不是数字的字符位置的size_t类型的指针,(不使用可填写NULL)to_string函数是将字符转化为字符串 参数表:数字(默认十进制,小数,整数都可以)参数解释:指定删除的位置,从这个位置删除之后字符的个数(包括指定位置这个字符)

2026-04-14 23:53:03 439 5

原创 泛型编程的基础——模板(初阶)

模板,是泛型编程的基础,泛型编程是与类型无关的编程模板本质:简而言之就是使用模板可以代表任何内置类型(指针和引用除外)。

2026-04-10 18:35:53 314

原创 C++类和对象,运算符重载,动态内存开辟

从一个简单的日期类,到完整的图书管理模块,再到动态数组、运算符重载、对象生命周期管理,这一段代码串联起了C++面向对象编程中最核心、最易出错、也最能体现编程思维的知识点。它没有复杂的框架与花哨的封装,只依靠最基础的类、构造、析构、拷贝、赋值、重载与动态内存,完成了一个可运行、可扩展、可理解的小型实战项目。在这个过程中,我们不仅修复了编译错误、链接问题、逻辑漏洞,更重要的是理解了为什么要写const、为什么要用引用、为什么要处理深拷贝、为什么要检查容量——这些正是从“会写代码”走向“写好代码”的关键一步。

2026-04-03 19:55:46 546 5

原创 C++零基础入门

1.命名空间要看懂上述代码首先要了解命名空间这个概念。命名空间本质上是一种域,在c++中,域有三种,分别是全局域,局部域,类域,和命名空间域。域的作用是为了避免C语言中的命名冲突问题,在使用变量前都需要在其前添加上出处,也就是域名,从而避免名字冲突问题。在一个域中,可以定义变量,函数。定义一个域只需要按照 namespace 域名{};在大括号中定义变量,函数就可以了。在全局中使用名字空间中的函数或变量时,需要在其前加上 命名空间名 : :。在c++中,所有的标识符都是命名在std这个域中的。

2026-03-22 13:31:45 431

原创 戏说编译与链接

源代码通过编译和链接转换为可执行程序。编译分为预处理(处理宏、头文件等,生成.i文件)、编译(词法/语法/语义分析,生成.s文件)和汇编(转换为机器指令,生成.o文件)三个阶段。链接阶段则处理多个模块间的调用关系,包括地址分配、符号决议等,最终生成可执行程序。编译错误主要在语义分析阶段产生,链接错误则在链接阶段出现。整个过程将高级语言代码逐步转换为计算机可执行的二进制指令。

2026-02-07 21:04:07 172

原创 c语言文件操作函数

本文摘要:文章系统介绍了C语言文件操作的相关概念和函数使用方法。主要内容包括:1.文件指针的概念,解释了标准输入/输出/错误流;2.文件的打开(fopen)和关闭(fclose)操作,详细说明了各种打开模式;3.文件的顺序读写函数(fputc/fgetc/fputs/fgets/fscanf/fprintf/fread/fwrite);4.文件的随机读写函数(fseek/ftell/rewind);5.文件读取结束的判断方法(feof/ferror)。文章通过实例代码展示了各函数的具体用法,并对比了不同操作

2026-02-07 21:03:01 1063 1

原创 字符函数字符串函数和内存函数

摘要:本文介绍了C语言中常用的三类函数:字符函数、字符串函数和内存函数。字符函数分为字符分类函数(如isspace、isdigit等)和字符转换函数(如tolower、toupper),需包含ctype.h头文件。字符串函数(如strlen、strcpy、strcmp等)主要用于字符串操作,需包含string.h头文件。内存函数(如memcpy、memmove、memset等)用于内存块操作,也需string.h头文件。文中详细说明了各类函数的参数、返回值及使用方法,并提及了部分函数的模拟实现方法。

2026-02-03 21:54:55 961

原创 c语言结构体类型介绍

本文介绍了C语言中结构体的基本概念和使用方法。首先阐述了结构体作为自定义类型的重要性,能够组合多种数据类型来描述复杂对象。文章详细讲解了结构体变量的创建方式、成员访问方法(包括.和->运算符),以及匿名结构体和结构体自引用的特性。重点分析了结构体内存对齐规则,说明其对程序性能的影响,并通过实例演示了如何优化结构体成员排列以减少内存浪费。最后介绍了两种提高内存利用率的方法:调整默认对齐数和使用位域技术,同时指出位域的跨平台限制。全文系统地介绍了结构体的核心知识点和使用技巧。

2026-02-01 14:32:22 1182

原创 C语言之数据在内存中的存储

摘要:整型数据在内存中以补码形式存储,通过原码转换得到。浮点数采用IEEE 754标准存储,分为符号位S、指数E(偏移编码)和有效数字M(隐含前导1)。整型数据存在大端和小端两种字节序存储方式。浮点数读取时需根据E的值区分三种情况:正常值、零值和无穷大。整型转换无精度损失,而浮点数转换可能存在精度丢失问题。

2026-01-31 09:32:45 1118

原创 c语言指针详解

本文系统讲解了C语言中指针的核心概念与应用。主要内容包括:1)指针变量的定义与内存占用(32位/64位环境差异);2)指针类型的作用及解引用操作;3)指针运算规则(加减整数、指针减指针);4)const修饰指针的三种情况;5)数组与指针的关系(数组名本质、数组指针与指针数组);6)函数指针与回调函数(如qsort应用);7)野指针的成因及防范措施。文章通过代码示例详细阐释了指针在内存访问、数组操作和函数调用中的关键作用,为深入理解指针机制提供了全面指导。

2026-01-30 11:26:59 12296 4

原创 用C语言实现数字炸弹游戏

首先是每次游戏都需要生成一个随机数,这里使用rand()函数,但是此函数生成的数并不是完全随机的,每次运行程序都是一样的,这是因为rand函数是根据种子来用算法实现数的生成的,如需生成一个标准的随机数,那么我们不妨把种子设置为时间,这里提及时间函数time( )将参数设置为NULL时函数会自动返回一个时间戳,由于时间戳每时每刻都在变化,这就确保了种子每时每刻都在变化,将时间戳赋给种子,就能生成一个随机数了。每一轮游戏都有一个循环,并且提示下一次玩家输入数的范围,直到玩家猜到“炸弹数字”,引发炸弹💣。

2026-01-27 10:56:25 693 1

空空如也

空空如也

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

TA关注的人

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