自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 12. STL的原理

STL六大组件之间的关系、原理

2025-03-30 21:45:49 929

原创 11. STL的使用

STL中常见容器的相关常见问题

2025-03-30 16:18:49 715

原创 10. 七大排序(含四种版本快排及优化) ******

七大排序的实现和原理,快排的四种排序-霍尔、挖坑、双指针、非递归,两种优化:三数取中法选key,小区间使用插入

2025-03-28 21:38:47 844

原创 9. 哈希****

哈希-位图-布隆过滤器-海量数据面试题

2025-03-26 15:55:17 877

原创 8.BST的缺陷解决方案:平衡树*****

目录1. AVL树1.1 性质1.2 具体实现细节大概如何实现的逻辑:怎样平衡:1.3 性能2. 红黑树2.1 性质2.2 具体实现细节怎样平衡:2.3 性能3. AVL 与 RBT 的区别AVL树也叫“高度平衡二叉搜索树”:2. AVL树-优快云博客AVL树是一种自平衡二叉搜索树,通过维护每个节点的平衡因子(左右子树高度差不超过1)来确保树的平衡。其核心实现包括每个节点包含键值、左右子节点指针和高度信息。平衡因子 = 左子树高度 - 右子树高度,必须为 -1、0 或 1。按二叉搜索树规则插入节点。更新节

2025-03-24 17:51:47 670

原创 3. 红黑树

红黑树插入的细节模拟实现,很细

2025-03-24 16:17:04 921

原创 2. AVL树

AVL树插入-旋转的实现

2025-03-23 17:03:31 808

原创 7. 二叉树****

a[0]为堆顶,也是最大值,将他和最后一个元素交换,此时堆顶就是最小的,然后把这个最小的元素向下调整,直到满足还是大根堆。要注意使用向下调整建堆的前提是:左右子树是大或小堆,所以传的parent是叶子结点的父结点,size-1是最后一个叶子结点,-1 / 2 找到它的父节点。向上调整的时间复杂度是O(NlogN),向下调整的时间复杂度是O(N),向上向下只是建堆的方式,至于是建大堆还是小堆,要看建堆中的大于号小于号。最佳的方式就是用堆来解决。,想要更小的元素,就得把大的放到堆顶,比堆顶小的一来就出掉堆顶。

2025-03-22 19:57:26 868

原创 6. 顺序表和链表*****

顺序表与链表与高频考题

2025-03-18 21:01:17 1005

原创 5.编译链接和宏**

数据存储-大小端

2025-03-14 22:34:46 698

原创 4.数据存储**

三种表示方法均有符号位和数值位两部分,符号位都是用0表示正,1表示负,而数值位这三种表示方法各不相同。上面是紫色的&b的值,绿色的是&a的值,可以看出a,b分别存的是补码。上面的例子就是小端,-2的补码:ff ff ff fe,fe是。可能导致数据丢失,通常发生在将较大的类型赋值给较小的类型时。如果系统是小端序,最低有效字节存储在内存的低地址处,因此。是为了避免数据丢失,自动将较小的类型转换为较大的类型。计算机中的整数有三种表示方法,原码,反码,补码。是无符号字符类型,占用 8 位,取值范围是。

2025-03-13 22:17:17 659

原创 3. 自定义类型****

联合是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员共用一块空间(所以联合也叫共用体)union Unchar c;int i;4我们发现c和i共用了空间,大小为4。

2025-03-12 23:46:09 893

原创 2.库函数的模拟实现*****

如果目标内存区域的起始地址小于或等于源内存区域的起始地址,说明没有重叠,或者重叠部分不会影响复制。如果还和上面一样进行复制,c变成a,d变成b,e就变成a了,我们想要得复制结果是e是c,因为重叠影响了复制,导致内容被覆盖了。首先要有一个返回变量 ret,保存目标内存区域的起始地址,因为后面会对 dst++,防止这个位置丢失。),因为比较的是指针的地址值,而不是指针所指向的数据。先把c赋给e,dst 和 src 各自减一,b赋给d,a赋给c,同样是进行count步。

2025-03-12 21:52:14 1071

原创 优选算法—双指针

使用。

2025-03-04 22:23:17 920

原创 1. 数组和指针*****

指向整个数组的指针,而非单个元素。

2025-02-25 23:09:24 819

原创 17.C++类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转换,C语言中共有两种形式的类型转换:隐式类型转换和显式类型转换。编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。缺陷:转换的可视性较差,所有的转换类型都是用一种相同的形式书写,难以跟踪错误的转换。1.隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败。用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

2025-02-25 23:01:15 709

原创 16. 特殊类设计

如果单例对象构造十分耗时或者占用很多资源,比如加载插件等,而有可能该对象程序运行时不会用到,但是程序一开始就进行初始化了,就会导致程序启动时非常缓慢。类的一个静态成员变量,它在程序启动时就被初始化,虽然我是在类中用类定义的,但是是静态对象,静态的不在类空间中,是在静态区的,所以没有先有鸡还是先有蛋的问题。的默认构造函数,创建单例对象,因为虽然是在类外,但是instance是类里的成员可以调用私有的构造。在 C++ 中,静态对象的析构函数会在程序结束时自动调用,利用这一特性,可以通过一个静态的。

2025-02-22 19:32:35 711

原创 15.智能指针

适用于。

2025-02-20 09:56:12 640

原创 14. C++11

目录1. 统一的列表初始化1.1 {} 初始化1.2 std::initializer_list2. 声明2.1 auto2.2 decltype2.3 nullptr3. STL中的一些变化3.1 新容器3.2 新接口3.3 所有容器支持{}列表初始化的构造函数3.4 所有容器新增了emplace系列 3.5 新容器增加了移动构造和移动赋值4. 右值引用和移动语义4.1 左值引用和右值引用4.2 左值引用和右值引用比较4.3 右值引用使用场景和意义4.4 右值引用引用左值及其一些更深入的使用场景分析4.5

2025-02-16 13:51:31 561

原创 1.二叉树进阶

如果相等,不插入,返回false。如果在上例中删除6这个节点,那么找到的leftMax是4,交换以后(下图所示),parent指向4,leftMax指向6,此时是parent的左 指向 leftMax,删除6的方式就是让4的左连接6的左,同理因为6的右一定为空,而6的左不一定为空,所以要连接6的左。递归的插入就很好理解了,比根的key小,就在根的左子树插入,就会在左子树中找到为空的位置,新建节点,我们可以发现,之前新建完节点以后,新节点没有和它的父亲连接起来,需要比较然后连接,这里为什么不需要呢?

2025-02-04 11:42:18 820

原创 13.多态

多态是在不同继承关系的类对象中去调用同一函数,产生了不同的行为。比如Student继承了Person,在买票这个函数中,Person是全价票,Student是半价票。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:public:intmain()return0;被virtual修饰的类成员函数称为虚函数。重载(Overloading)发生在同一个类中方法名相同,参数列表不同(参数类型或个数不同)

2025-01-19 10:53:30 764

原创 12. C++中的继承

继承是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类,继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

2025-01-17 12:57:13 826

原创 11.模板进阶

如果我们将模板的声明放在a.h,将模板的定义放在a.cpp,在main.cpp中调用函数,在a.cpp中编译器没有看到对模板函数的实例化,不会生成具体的函数,在main中调用函数,编译器在链接时才会找到其地址,但是并没有实例化生成具体代码,因此链接时报错。通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理,比如:实现一个专门用来进行比较的函数模板。类类型形参:出现在模板参数列表中,跟在class或者typename之后的参数类型名称。

2025-01-14 13:59:21 586

原创 10.stack 和 queue

stack是一种容器适配器

2025-01-13 20:46:35 979

原创 09.list

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。与其他序列式容器相比,list通常在任意位置插入、移除元素的效率更好。与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问。比如:要访问list的第6个元素,必须从已知的位置(头和尾)一步步走到该位置;

2025-01-07 12:02:33 1057

原创 08.vector

vector和string不同,string后有 \0,可以更好的兼容C,string有很多它专用的接口,vector的比大小没什么用,总的来说,vector和string各有其使用价值。是 C++ 标准模板库 (STL) 提供的一个动态数组容器,位于头文件<vector>中。它是一个能够动态调整大小的数组,提供了非常方便的动态存储机制和丰富的接口。相比传统的 C 风格数组,更加安全、灵活且功能强大。特性:动态大小vector的大小是动态的,可以随着元素的插入或删除自动扩展或收缩。

2025-01-02 15:42:32 693

原创 leetcode 9.回文数(整数不转成字符串)

给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。121123x = 121truex = -121false从左向右读, 为 -121。从右向左读, 为 121-。因此它不是一个回文数。x = 10false从右向左读, 为 01。因此它不是一个回文数。不将整数转为字符串来解决这个问题吗?

2024-12-30 18:59:16 362

原创 leetcode137. 只出现一次的数字 II

给你一个整数数组nums,除某个元素仅出现外,其余每个元素都恰出现请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。399计算出数组中所有数的二进制的每一位的1的个数,如果某位上1的个数 %3 等于 0,那么要么有3的倍数个1,要么没有1;如果不等于0,也就是1的个数不是3的倍数。遍历数组中每一个数的第i位(右移i个),如果这个位等于1,count就加1。

2024-12-30 17:16:01 607

原创 07.string类

在 C++ 中,是一个非常重要的类,位于标准库的<string>头文件中,专门用于处理字符串。它提供了功能丰富的接口和动态的内存管理,是 C 风格字符串(字符数组char[])的更高效、更安全的替代品。

2024-12-26 21:28:47 637

原创 06.模板初阶

class 类模板名public:// 成员函数声明// 定义成员函数(错误示例)void MyClass::display() { // 错误:没有模板参数列表,编译器无法识别在类模板中,模板参数(如T)是在模板类定义时引入的。如果在类外定义成员函数,而不提供模板参数列表,编译器无法将这些成员函数与类模板关联起来,因此会报错。在类外定义成员函数时,MyClass中的T是模板参数,编译器需要模板参数列表来解析T。即使函数定义内与模板参数T无关,这仍然是一个函数模板。即使。

2024-12-19 22:26:51 682

原创 05.C++内存管理

6.申请自定义类型对象时,malloc/free只会开辟空间,不会调用析构函数和构造函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。申请和释放单个元素的空间,使用new和delete;3.malloc申请空间时,需要手动计算空间大小并传递,new只需在后面跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可。1.判断:一般来讲在 32 位系统下,堆内存可以达到4G的空间,但是对于栈来讲,一般都是有一定的空间大小的。

2024-12-17 22:33:01 963

原创 04.类和对象(下)

的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加。

2024-12-15 10:23:17 655

原创 03.类和对象(中)

这个代码会报错,是因为在类外的函数访问了类中的私有成员,如果我们把私有成员改为公有的,是可以实现的,可实际中为了隐藏类的内部实现细节,只对外提供有限的接口,这种封装方式能够保护对象的状态不被外部代码直接修改,我们往往把成员变量设置为私有的,该怎么做呢:将bool operator写进类中作为成员函数,但还是会报错,这是为什么呢?后置++是先使用,所以用temp保存++前的值,然后给this+1,而temp是临时对象,只能以值的方式返回,若用引用返回,函数结束时,temp会销毁,引用不到了。

2024-12-12 23:01:50 723

原创 Linux下基本指令

市面上有很多图形化的发行版本,比如我们学校当中很多人都在使用的Ubuntu,CentOS等,相比于纯命令行式的操作, 有图形化操作界面更人性化,更方便,从我们日常使用的window过渡到linux系统时衔接平滑。但是,在一些企业服务器的后端,没有显示器,甚至键盘也没有,就是纯命令行式访问,为了在日后的工作中能够快速上手,我选择了纯命令行式的学习,也并没有装虚拟机,而是使用了阿里云的云服务器,然后使用Xshell进行登入。

2024-11-17 14:15:45 1038

原创 02.类和对象(上)

类体:由成员函数和成员变量组成一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中的内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式:1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。所以,C++中长函数就声明定义分离,短的直接在类中定义。

2024-11-06 14:13:52 652

原创 01.C++入门

定义命名空间,需要使用namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。其一:命名空间中可以定义变量/函数/类型int val;其二:命名空间可以嵌套int a;int b;int c;int d;int main()其三:同一个工程中允许有多个相同名称的命名空间,编译器最后会合成同一个命名空间中。同一个工程中的test.h和test.cpp中同一个namespace会合并,都可以调用,但是,相同命名空间中不能定义同一个变量。

2024-10-12 22:48:02 686 1

原创 数组应用实例-三子棋

至此,我们已经实现了这个小游戏

2024-08-11 12:52:09 891

原创 一维数组和二维数组

数组的下标是有范围限制的,数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1,所以如果数组的下标超过这个范围,数组就越界访问了,超出了数组合法空间的访问。因为当数组传参时,实际上是把数组的首元素地址传过去了,所以即使在函数参数部分写成数组的形式:int arr[]表示的依然是一个指针:int *arr。思路是对的,但是这样写出来的代码是错的,我们可以发现调试后,bubble_sort函数内部的sz是1,我们想要的sz是10。由此可以得出结论:数组在内存中是连续存放的。

2024-08-04 11:21:47 1723

原创 函数与递归

库函数虽然很重要,很丰富,但是并不是说能干所有的事情,其实更加重要的是自定义函数。自定义函数和库函数一样都有函数名、返回值类型、函数参数。但是这些都是我们自己来设计,所以说发挥空间很大。statement;ret_type 返回类型fun_name 函数名para1 函数参数ex1:写一个函数找出两个整数的最大值方法1:if (x > y)return x;方法2:x : y);int b = 0;

2024-07-28 21:13:32 799

原创 分支与循环语句(下)

我们可以发现while循环中也存在循环的三个必要条件,但是由于while的条件之间相距较远,这样查找修改就不够方便与集中,所以for循环的风格更胜一筹,for循环的使用频率也更高。3.rand函数在使用之前要使用一个srand函数来设置随机数的生成器,两者要配套使用,否则rand生成的是伪随机数。经典的赋值与判断错误,“==”和“=”,在分析代码时一不小心就会误认为是同一个意思,但其实循环一次都进不去。的情况下还是用的到的,多层循环这种情况使用break是达不到目的的,它只能从最内层循环推出到上一层循环。

2024-07-20 13:22:13 1464

空空如也

空空如也

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

TA关注的人

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