自定义博客皮肤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)
  • 收藏
  • 关注

原创 算法:模拟

'a''z'???

2025-06-09 21:53:02 1004

原创 算法:位运算

: 有0就是0。|:有一就是一^:相同为0,相异为1。哈希表中里面开32个空间n & (-n)。将最右侧的1,左边的区域全部变成相反的。

2025-06-08 21:11:47 667

原创 算法:前缀和

这道题如果使用暴力解法时间复杂度为O(n*m),会超时,所以要使用前缀和算法。前缀和->快速求出数组中某一个连续区间的和。第一步:预处理出一个前缀和数组 dp。dp[i]表示[1, i] 区间内所有元素的和,dp[i] = dp[i - 1] + arr[i]。第二步:使用前缀和数组要求[l, r] 区间的值,就等于dp[r] - dp[l - 1]。

2025-06-05 17:47:37 1107

原创 算法:二分查找

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)用二分查找解决,要查找一个区间要找去左端点和右端点。1. 查找区间的左端点细节处理:1.循环条件 left < right而不是left <= right ,因为left == right 的时候就是最终结果,无需判断。

2025-06-02 12:26:36 863

原创 算法:滑动窗口

​数据污染​当处理完偏移量i=0后,hash2会保留窗口中的单词频次。当处理i=1单词频次统计错误(包含前一轮的数据)count计数器失效(累计了无效计数)public://保存words里面所以单词的频次hash1[e]++;i < len;i++)//执行len次,因为words字符串出现的地方不一定是len整数倍的地方//维护窗内单词的频次//进窗口count++;if(right - left + 1 > len * m)//判断count--;//出窗口。

2025-05-31 23:15:49 1191

原创 封装红黑树实现map和set

如果节点的右不为空,说明这个子树的中序没有走完,再走右子树的最左节点;如果节点的右为空,那么这棵子树已经中序遍历完了,此时下一步要找祖先结点,当当前节点是父亲节点的左的时候停止,这个父亲节点就是下一步要走的结点。,其中构造时要传_root是因为在实现operaor--时需要--end(),需要找到这棵树的最右节点,所以需要传_root。--的逻辑与上面++的逻辑相反,节点的左不为空,就先走左的最右节点;左为空,就找祖先中,当前节点是父亲的右就停止。

2025-05-28 19:17:04 687

原创 红黑树实现

红黑树是一棵二叉搜索树,他的每个节点增加一个存储位来表示节点的颜色,可以是红丝或者黑色。通过对任何一条从根到叶子的路径上各个节点的颜色进行约束,,因而是接近平衡的。

2025-05-16 21:10:38 1031

原创 AVL树实现

AVL树是一种自平衡二叉搜索树,由G.M. Adelson-Velsky和E.M. Landis于1962年提出。其核心特性是每个节点的左右子树高度差不超过1,通过平衡因子(右子树高度减左子树高度)来维护平衡。AVL树的插入操作遵循二叉搜索树规则,插入后更新平衡因子,若出现不平衡(平衡因子为2或-2),则通过旋转操作恢复平衡。旋转分为四种:左单旋、右单旋、左右双旋和右左双旋。AVL树的查找、插入、删除等操作的时间复杂度均为O(logN),相较于普通二叉搜索树,其平衡性显著提升了操作效率。代码实现中,通过平衡

2025-05-10 18:03:51 755

原创 map和set的使用

set的声明如上,T是set底层关键字的类型set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模版参数。set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历走的是搜索树的中序,所以是有序的。

2025-05-03 11:43:47 840

原创 二叉搜索树

场景1:⼩区⽆⼈值守⻋库,⼩区⻋库买了⻋位的业主⻋才能进⼩区,那么物业会把买了⻋位的业主的⻋牌号录⼊后台系统,⻋辆进⼊时扫描⻋牌在不在系统中,在则抬杆,不在则提⽰⾮本⼩区⻋辆,⽆法进⼊。场景2:商场⽆⼈值守⻋库,⼊⼝进场时扫描⻋牌,记录⻋牌和⼊场时间,出⼝离场时,扫描⻋牌,查找⼊场时间,⽤当前时间-⼊场时间计算出停⻋时⻓,计算出停⻋费⽤,缴费后抬杆,⻋辆离场。场景3:统计⼀篇⽂章中单词出现的次数,读取⼀个单词,查找单词是否存在,不存在这个说明第⼀次出现,(单词,1),单词存在,则++单词对应的次数。

2025-04-23 11:10:36 920

原创 C++ 多态

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

2025-04-20 19:38:55 738

原创 算法专题:双指针

双指针算法两个指针的作用:cur:从左向右遍历数组 dest:已处理区间内非零元素的最后一个位置。非零元素0待处理cur遍历过程中遇到0元素cur++,遇到非0元素交换cur和dest+1位置的值,dest++和cur++

2025-04-12 20:06:58 886

原创 C++ 继承

我们看到Person是基类,也称作父类,Student是派生类,也叫做子类。

2025-04-12 20:06:27 822

原创 stack和queue

适配器是一种设计模式(设计模式是一套反复使用的,多数人知晓的,经过分类编目的,代码设计经验的总结)该种模式是将一个类的接口转换成了客户希望的另一个接口。容器适配器就像我们的电源适配器一样。是一种转化接口,把一种接口转化为我们需要的接口。deque(双端队列):是一种双开口的“连续”空间的数据结构,双开口的含义是:可以在头尾两端进行插入删除操作,且时间复杂度为O(1),与vector相比,头插效率高,不需要搬移元素,与list相比,空间利用率高。

2025-04-05 22:54:36 1014

原创 模版的特性及其编译分离

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所以目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。优点1.模版复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2.增强了代码的灵活性缺点1.模版会导致代码膨胀问题,也会导致编译时间变长2.出现模版编译错误时,错误信息非常凌乱,不易定位错误。

2025-04-05 22:54:06 949

原创 vector及其模拟实现

构造函数声明接口说明vector()无参构造构造并初始化n个val拷贝构造使用迭代器进行初始化构造int main()return 0;

2025-03-16 17:06:32 1020

原创 list及其模拟实现

list其实就是一个带头双向链表。

2025-03-16 17:06:09 955

原创 string类

string的文档介绍在使用string类时,必须包含using namespace std;

2025-02-17 11:28:34 915

原创 C++模版(初阶)

templateclassT1classT2, ...,classTnclass类模板名// 类内成员定义public:,_size(0){}~Stack()//模板不建议声明和定义分离到两个文件.h和.cpp中,会出现链接错误。int main()//类模板类型都是显示实例化return 0;

2024-12-08 21:57:47 911

原创 C/C++内存管理

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc和free不会。int main()// new/delete对于自定义类型除了开空间还会调用构造函数和析构函数free(p1);delete p2;*/A aa1(1);A aa2(2);A aa3(3);return 0;new的原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造new T[N] 的原理。

2024-12-07 22:48:39 884

原创 类和对象(下)

因为初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关。上述代码先声明_a2,走初始化列表,此时_a1还未被初始化,所以_a2此时是随机值。然后再初始化_a1,传值为1,故_a1为1。

2024-12-07 19:47:16 1153

原创 类和对象(中)(类的默认成员函数)+日期类实现

默认成员函数就是用户没有显示实现,编译器会自动生成的成语函数称为默认成员函数。一个类,我们不写的情况下编译器会默认生成6个默认成员函数。C++11后还增加了两个默认成员函数,移动构造和移动赋值(这一节暂时不讲)。

2024-12-03 21:03:25 1043

原创 动态内存管理与柔性数组

我们已经掌握的内存开辟方式有://在栈空间上开辟4个字节//在栈空间上开辟10个字节的连续空间但是对于空间需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。C语言引入了动态内存开辟,让程序员自己可以申请和释放空间,就比较灵活了。

2024-11-22 20:15:05 626

原创 排序算法:直接插入排序,希尔排序,选择排序,快速排序,堆排序,归并排序

如图所示,当插入第i个(i>=1)元素的时候,前面的arr[0],arr[1]......arr[i-1]已经排好序,此时用arr[i]的元素与前面的元素进行比较,找到插入的位置将arr[i]插入,将原来的元素顺序后移。直接插入排序的特性总结:1.元素集合越接近有序,直接插入排序算法的时间效率越高2.最坏时间复杂度:O(N^2)最好时间复杂度:O(N)3.空间复杂度:O(1)4.稳定性:稳定。

2024-11-21 23:31:46 1369 1

原创 二叉树和堆

根结点左右子树不是堆,我们怎么调整呢?对于深度为k的,有n个节点的二叉树当且仅当每一个节点都与深度为k的满二叉树中编号从1至n的节点一一对应时称为完全二叉树。运用层序遍历,将空节点也进队列,当队头元素为空时跳出循环,判断此时队列中的元素节点是否为空,为空则为完全二叉树,不为空则不是完全二叉树。思路:将左子树和右子树拆出来,然后比较左子树和右子树,左子树的左是否等于右子树的右,左子树的右是否等于右子树的左。删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调整算法。

2024-10-30 09:38:15 997 1

原创 栈和队列的实现

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作,。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入的数据在栈顶。出栈:栈的删除操作叫做出栈,出的数据也在栈顶。

2024-09-08 17:39:38 507

原创 链表与顺序表的区别和联系

缓存基本上来说就是把后面的数据加载到离自己近的地方,对于CPU来说,它是不会一个字节一个字节的加载的,因为这非常没有效率,一般来说都是要一块一块的加载的,对于这样的一块一块的数据单位,术语叫“Cache Line”,一般来说,一个主流的CPU的Cache Line 是 64 Bytes(也有的CPU用32Bytes和128Bytes),64Bytes也就是16个32位的整型,这就是CPU从内存中捞数据上来的最小数据单位。不在缓存,叫不命中,要把数据存内存加载到缓存,再访问。在缓存,缓存命中直接访问。

2024-09-02 09:09:20 254

原创 142.环形链表二-力扣

思路:定义快慢指针,先判断是否有环,如果有环就slow和fast相遇,此时,slow开始向后走一步,head向后走一步,当slow和fast相遇时,便是环的第一个节点。

2024-09-01 11:17:59 277

原创 141.环形链表-力扣

假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,因此:在满指针走到一圈之前,指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。来表示链表尾连接到链表中的位置(索引从 0 开始)。:快指针一次走三步,四步......n步可以吗?:为什么快指针走两步慢指针走一步可以?快指针肯定是可以追上慢指针的,即相遇。,判断链表中是否有环。

2024-08-31 10:29:11 324

原创 #运算符和##运算符

#可以把位于它两边的符号合成一个符号,它允许宏定义从分离的文本片段创建标识符。##被称为记号粘合。这样的连接必须产生一个合法的标识符。否则结果就是未定义的。

2024-08-26 19:00:38 189

原创 类和对象(上)

类的定义 ,实例化,this指针

2024-08-01 21:59:51 1056

原创 C++基础

命名空间,C++输入输出,缺省参数,函数重载,引用,inline内联函数,nullptr

2024-07-28 13:12:35 627

原创 qsort 函数和模仿qsort函数实现冒泡排序

上述是一个冒泡排序,如果要修改,则应该将比较部分修改。冒泡排序只能排序整形数据,有局限性。

2024-07-19 22:36:03 241

原创 闯关大冒险

比如,假设 n 的值为整数 1256 ,那么这个数的千位为1 、百位为2 、十位为 5 、个位为 6 ,各个位中的最大数是 6 ,因此密码就是数字 6。密码计算方式是这样的:给每位选手 1个 4 位的整数n ,只要计算出这个整数 n 各个位中的最大数,就是该关卡的密码。晶晶参加学校组织的闯关大冒险的游戏,游戏中有一关是这样的,选手要计算出正确的密码,才能凭该密码进入下一关。请你编程帮助晶晶,快速计算出该关卡的密码。

2024-07-17 19:57:54 341

原创 双向链表的实现

链表分类有八种:带头 不带头单向 双向循环 不循环(8种);最常见的是两种:单链表(不带头单向不循环链表)双向链表(带头双向循环链表)

2024-07-16 21:23:31 312

原创 经典单链表的OJ题

重复原因:新链表存在空链表和非空链表两种情况。上述代码存在重复代码,该如何优化?解决思路:让新链表不为空。解决方法创建一个哨兵位。

2024-07-04 09:58:20 369

原创 单链表专题

1.链表的概念及结构概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。与顺序表不同的是,链表⾥的每节"⻋厢"都是独⽴申请下来的空间,我们称之为“结点/节点”节点的组成主要有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)。

2024-06-11 11:45:28 223

原创 顺序表的实现及基于顺序表实现通讯录

数据结构是由“数据”和“结构”两词组合⽽来。什么是数据?常⻅的数值1、2、3、4.....、教务系统⾥保存的用户信息(姓名、性别、年龄、学历等。⽹⻚⾥⾁眼可以看到的信息(⽂字、图⽚、视频等等),这些都是数据2.什么是结构当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的⽅式。

2024-05-15 23:04:45 847

原创 自定义类型:联合体

上述的结构其实设计的很简单用起来也方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存。像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以是不同的类型。联合的成员是共用同一块内存空间,这样一个联合变量的大小,至小时最大成员的大小(因为联合至少有能力保存最大的那个成员)。代码1输出的三个地址一模一样,代码2的输出,我们发现将i的第四个字节的内容修改成了55了。2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。int colors;

2024-04-07 20:43:02 1717 1

原创 结构体和位段

结构体和位段的讲解

2024-04-05 16:15:27 1699 1

空空如也

空空如也

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

TA关注的人

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