- 博客(55)
- 收藏
- 关注
原创 【C++】分治-快速排序算法习题
文章摘要: 本文介绍了四道基于快速排序思想的算法题解。1️⃣颜色分类:使用三指针法将数组划分为0、1、2三个区域。2️⃣排序数组:通过随机选择基准值优化快排,将数组分为三块区域递归处理。3️⃣第K个最大元素:在分区后通过计算各区域元素数量定位目标值。4️⃣最小K个数:同样采用三区域划分策略快速定位结果。所有解法均利用了快速排序的高效分区思想,时间复杂度接近O(n)。(149字)
2025-11-04 20:43:28
692
27
原创 【C++】前缀和算法习题
2.用一个for循环枚举每一个可能是中心点的下标,如果该下标的前缀和和后缀和都相等,则返回;循环结束后若还是没找到,则返回-1。
2025-10-26 16:42:19
1231
25
原创 【C++】二分查找算法习题
在排序数组中查找元素的第一个和最后一个位置1.我们可以采用二分左边界和右边界的方法2.在二分左边界时,我们可以根据中间点mid的落点来进行更新,如果中间值mid的值小于目标值,就让left指向mid + 1的位置,否则就让right指向mid的位置(注:不能指向mid - 1,有可能mid是最终结果3.二分右边界时,同样也是根据mid的落点来进行判断,如果mid的值大于目标值,则让right指向mid - 1的位置,否则让left指向mid(注:同样不能指向mid + 1,mid可能是最终结果。
2025-10-23 12:20:11
898
30
原创 【C++】智能指针介绍
本文介绍了C++中RAII机制和智能指针的概念、使用及实现原理。RAII(资源获取即初始化)通过对象生命周期管理动态资源,避免泄漏。智能指针在此基础上重载运算符,提供类似指针的访问方式。C++标准库提供了四种智能指针:auto_ptr(C++98,已弃用)、unique_ptr(禁止拷贝,支持移动)、shared_ptr(支持拷贝和移动)和weak_ptr(解决循环引用)。文章详细讲解了它们的特性和使用场景,并通过代码示例展示了如何自定义删除器以支持不同资源释放方式。最后,模拟实现了auto_ptr和uni
2025-10-10 16:05:05
1150
25
原创 【C++】异常介绍
C++异常处理机制详解 异常是C++中处理错误的重要方式,通过throw、try、catch三个关键字实现。当函数抛出异常时,程序会暂停当前执行,沿着调用链查找匹配的catch子句,这个过程称为"栈展开"。异常捕获遵循最近匹配原则,可使用catch(...)捕获任意异常。异常安全是重要考量,需要注意资源泄漏问题。C++11引入了noexcept关键字声明不抛异常的函数。异常处理优点在于能清晰展示错误信息,但缺点是可能打乱程序流程并导致内存泄漏。合理的异常处理需要权衡其优缺点,在适当场景下
2025-10-01 23:36:27
1091
33
原创 C++11(2)
摘要 本文介绍了C++11中的可变模板参数、新的类功能、STL容器变化以及lambda表达式等特性。主要内容包括: 可变模板参数的语法和使用方法,如参数包展开的递归方式和逗号表达式方式,以及emplace系列接口的优势。 新增的默认移动构造函数和移动赋值运算符,以及如何使用default和delete控制默认函数的生成。 STL容器新增了unordered_map和unordered_set等容器,并提供了与右值引用相关的push/insert/emplace系列接口。 lambda表达式的概念、语法规则和
2025-09-27 00:40:53
1016
27
原创 C++11(1)
C++11核心特性解析 C++11作为现代C++的起点,引入了多项革命性特性: 列表初始化:统一初始化语法,支持内置/自定义类型,新增std::initializer_list简化容器初始化。 右值引用:通过&&标识,实现移动语义(移动构造/赋值),解决深拷贝性能问题,完美转发临时对象资源。 类型系统增强:细分值类型为左值、纯右值、将亡值,引入引用折叠规则(如T&& &&折叠为T&&)。 应用场景:优化STL容器构造、函数返回值处理,提升资源转
2025-09-24 00:38:54
1151
25
原创 我的创作纪念日 ----- 第512天
这是一篇CSDN创作者的512天纪念文章摘要。作者回顾了从一名学习者成长为创作者的历程,分享了在创作期间收获的近2000名粉丝关注、读者互动以及结识的IT领域朋友。文章展示了作者解决链表问题的代码成就,并展望了未来进入大厂和持续创作优质技术文章的职业规划与创作愿景。全文以"锲而不舍"为精神指引,展现了作者在技术道路上的坚持与成长。
2025-09-19 18:16:31
541
23
原创 【C++】数据结构 --- 哈希表
本文主要介绍了哈希表的基本概念、哈希函数和哈希冲突处理方法。哈希是一种通过哈希函数建立关键字与存储位置映射关系的数据组织方式,负载因子反映了空间利用率与冲突概率的关系。文章详细讲解了直接定址法、除留余数法、乘法散列法等哈希函数,并分析了开放定址法(线性探测、二次探测、双重探测)和链地址法等冲突处理方法的特点及应用场景。通过示例展示了不同方法在实际应用中的具体实现过程,为理解哈希表的工作原理提供了全面的参考。
2025-09-19 00:42:50
1464
22
原创 【C语言】初阶数据结构相关习题(二)
🎆个人主页:夜晚中的人海今日语录:知识是从刻苦劳动中得来的,任何成就都是刻苦劳动的结果。——宋庆龄。
2025-05-15 18:39:43
2415
116
原创 【C语言】初阶数据结构相关习题(一)
🎆个人主页:夜晚中的人海今日语录:人的生命似洪水在奔流,不遇着岛屿、暗礁,难以激起美丽的浪花。——奥斯特洛夫斯基。
2025-05-06 13:22:51
2867
147
原创 【C语言】初阶算法相关习题(一)
2.然后遍历两个数组,定义一个变量flag初始化为0,当找到相等元素时,将nums2[j]的值置为-1,目的是避免重复匹配,同时将flag置为1,表示找到相同元素。1.首先判断两个数组的长度谁大,根据较大值开辟一个数组result,用于存储相交时的结果,再定义一个变量k,用于记录结果数组中元素的个数。4.遍历输入字符串的每个字符,利用 str 数组记录字符的出现情况,并统计不同字符的数量,统计完后将改位置的值设为1,避免重复计算。
2025-04-22 13:22:46
1886
62
原创 【C语言】编译和链接详解
并且包含的头文件都被插入到.i文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候,可以查看预处理后的.i文件来确认。
2025-04-12 17:48:24
2791
85
原创 【C语言】整数和浮点数在内存中的存储
今天我们来讲一下整数和浮点数在内存中的存储方式以及大小端字节序的判断以及了解什么叫大小端,下面就一起来看看吧。
2025-04-03 17:50:55
1523
81
原创 【C语言】文件操作(详解)
磁盘(硬盘)上的文件是文件。但是在设计程序中,我们一般把文件分为两种:一是程序文件,另一个是数据文件。(从文件功能的角度进行分类)
2025-03-25 22:01:32
1501
89
原创 【C语言】内存函数详解
功能:从源空间的位置开始向后复制num个字节的数据到目标空间所指向的内存位置。该函数遇到 ‘\0’ 时并不会停下来如果目标空间和源空间有位置重叠时,复制的结果都是未定义的。功能:和memcpy最大的区别就是memmove函数处理的源内存块和目标内存块是可以重叠的。因此有内存重叠的部分就交给memmove函数来处理。功能:用来设置内存的,将内存中的值以字节为单位设置成想要的内容。功能:比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。
2025-03-24 15:55:00
993
56
原创 【C语言】字符串函数详解
功能:将一个源字符串的内容完整拷贝到目标字符串中源字符串必须以 ‘\0’ 结束。会将源字符串中的 ‘\0’ 拷贝到目标空间。目标空间必须足够大,以确保能存放源字符串,否则就会发生报错。目标空间必须可修改,不能加const修饰。功能:将一个字符串连接到另一个字符串的末尾。源字符串必须以 ‘\0’ 结束。目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。目标空间必须有足够大,能容纳下源字符串的内容。目标空间必须可修改,不能加const修饰。
2025-03-22 11:34:47
1206
36
原创 【C语言】指针详解 ---- 看完让你对指针有着更深刻的认识
我们要知道,计算机在处理数据时,数据是是在内存中读取的。函数指针的定义:假设数组存储的是 int (*)(int ,int),首先有一个数组arr先与[ ]结合,然后数组存储的是函数指针:int(*arr[ ])(int,int),[ ]里填的是数组元素的个数。sizeof(arr)计算的是一个地址的大小而不是数组的大小,而函数参数的本质是指针,因此无法计算出数组的元素个数。我们就以整型指针举例进行指针加整数的操作:因为数组在内存中是连续存放的,只要知道第⼀个元素的地址,我们就能找到后面的所有元素。
2025-03-18 13:41:47
1784
62
原创 【C语言】------ 实现扫雷游戏
扫雷游戏,相信大家对此并不陌生。这次我们使用C语言实现扫雷游戏的目的就是为了巩固我们之前所学习的知识,将我们的所学的知识串联起来,加深我们对知识的理解。
2025-03-08 17:28:22
2940
54
原创 【C++】红黑树的底层原理以及实现
我们在前面的文章中提到了当一棵树退化成单支时导致性能和效率降低时,我们可以用AVL树来解决这一问题。但由于AVL树是一棵高度平衡的树,且每次修改树的结构时都要保证左右子树的高度差不超过1。因此如果需要一棵结构动态变化的二叉搜索树时,红黑树的作用就出来了。下面就来详细讲解一下有关红黑树的相关知识以及操作。
2024-10-24 00:23:48
1789
100
原创 【C++】map和set的介绍以及用法
我们来看看以下几个有关于set的要点:1.set是用来存储唯一元素的容器,且按照一定的顺序进行排列。2.set中不允许出现重复的元素,其本质是负责排序+去重。3.set在底层是用红黑树来实现的。4.set的比较默认按照小于进行。5.set的正向迭代器遍历为升序序列,反向迭代器为降序序列。6.在set类中的其内容可以进行删除,但不支持修改。7.set中查找某个元素的时间复杂度为logN。map是C++中STL的一个关联式容器,它是以键值对。
2024-10-12 23:48:56
1906
95
原创 【C++】AVL树的底层以及实现
优点:**1.查找效率高:**由于AVL树总是保持平衡,其高度相对较低,因此查找操作的时间复杂度为O(log2N),效率较高。AVL树的平衡性使得其结构相对稳定,不会出现极端不平衡的情况,从而保证了操作的稳定性和可靠性。AVL树在插入和删除节点时,可能需要通过旋转操作来保持树的平衡,比较复杂。在频繁插入和删除的场景下,AVL树需要不断地进行旋转操作来保持平衡,这就有可能导致性能降低。
2024-10-08 23:40:52
1859
95
原创 【C++】二叉搜索树的底层以及实现
找N左子树的值最大结点R(最右结点)或者N右子树的值最小结点R(最左结点)来替代N,因为这两个结点中任意⼀个放到N的位置,都满足二叉搜索树的规则。2.树不空,按二叉搜索树性质,插入的值比当前结点大时往右走,插入值比当前结点小时往左左,直到找到空位置时,插入新结点。3.如果支持插入相等的值,插入值跟当前结点相等的值可以往右走,也可以往左走,直到找到空位置,插人新结点。(注:替代N的意思就是将N和R的两个结点的值交换,转变成删除R的结点)若它的右子树不为空,则右子树上所有结点的值都大于等于根结点的值。
2024-09-22 15:56:01
2267
96
原创 【C++】多态的认识和理解
多态是⼀种继承关系的下的类对象,去调用同一函数,从而产生了不同的行为。例如:Student继承了Person,Person对象买票为全价票,而Student对象买票则为优惠票。
2024-09-18 17:23:28
2274
113
原创 【C++】priority-queue的底层原理及实现
首先在进入优先级队列的学习之前,我们需要先对优先级队列有一定的了解。优先级队列是容器适配器中的一种,元素在队列中的顺序是按照它们的优先级来排列的,而不是按照它们被插入的队列的顺序。这其实就是数据结构中的堆,其底层都是以数组存储的完全二叉树,下面就来详细了解一下priority-queue是如何进行使用的。Priority Queue(优先级队列) 是一种特别的数据结构,它为队列中的每个元素都分配了一个优先级。在这个队列里,元素并非按照被插入的顺序来排列,而是依据它们的优先级来排序。
2024-09-10 13:29:46
2197
112
原创 【C++】有关vector迭代器失效问题
那么如果当前位置的元素刚好就是最后一个元素时,当对其进行删除时,返回的位置则指向end(),而end()的位置并没有元素,那么当对其进行解引用时也会导致程序崩溃,因此编译器认为这样的操作并不安全,于是认为当删除完元素时,迭代器就应该按失效的方式处理,不再对其进行使用。过程:it一开始指向初始空间的元素,而再次进行尾插操作时,由于空间不够需要扩容,因此需要释放旧空间开辟新空间,但此时的it还是指向已经被释放的旧空间,已经成为野指针了,因此再循环当中对野指针进行解引用是就会导致程序崩溃。
2024-08-30 18:19:19
1874
85
原创 我的CSDN-----第128天创作纪念日
起初的我,是为了在学习代码的过程中通过写博客的方式来巩固自己的知识。后来在遇到不会的问题时可以在csdn上面查找,寻求一点思路,将学到的知识通过博客的方式呈现出来。每当发布一篇博客后,就会收到很多人的评论加关注,随着粉丝的增加,自己也有了创作的动力,也在创作过程中结识了许多创作出优质文章的作者,一起不断进步。即使学业繁忙,我也会合理分配时间,尽自己的能力范围内,去创作出优质的文章。希望在往后的创作日子里,能够不断提高自己的能力水平,创作出优质更加的文章,去帮助更多的人解决问题,努力学习,共同进步!
2024-08-24 23:50:27
1688
77
原创 【C++】vector的模拟实现
reserve函数是完成对对象空间进行扩容操作的,当插入的数据大于对象的空间时,则会进行扩容操作,如果插入的数据小于对象空间时,则不会进行任何操作。这里需要注意的是:在代码最后三行我们可以看出,此时的_start是指向新空间的起始位置,_finish如果想调用size()时,而。size函数是用来返回数据vector对象中的有效数据个数,capacity函数则返回vector对象的容量空间的大小。vector的begin是返回容器的_start的位置,end则返回容器的_finish的位置。
2024-08-22 17:21:00
1894
92
原创 【C++】string类的模拟实现
+_size;// 大于2倍,需要多少给多少,小于2倍按2倍扩//插入字符//挪动数据--end;++_size;//插入字符串--end;i < len;else// 如果len大于剩余字符长度,更新lenstring sub;i < len;i++)
2024-08-18 11:26:59
1463
82
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅