自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 进程概念介绍

首先我们要理解冯诺依曼体系结构这里的存储器指的是内存,这里的中央处理器只能对内存(存储器)进行访问,不能访问外设外设要输入或者输出数据,也只能写入内存或从内存中读取所有设备都只能和内存打交道。

2025-11-22 12:09:27 763 1

原创 二叉树进阶

若目标值x等于节点值,找到,返回true。若x小于当前节点值,向左查找,若大于,向右查找。若遍历空节点仍未找到,返回fasle。若待插入值已经存在,插入失败,否则根据值的大小插入到父节点的左/右孩子位置。4有左右孩子,找到该节点右子树中序遍历的第一个节点,用其值替换待删除节点的值,删除这个最小值节点。删除是最复杂的操作,核心是需要保持删除节点后仍然保持二叉搜索树的性质。2只有左孩子,删除后,父节点指向该节点的左孩子。3只有右孩子,删除后,父节点指向该节点的右孩子。如果树为空,直接创建新节点作为根节点。

2025-11-16 09:37:00 182

原创 多态的介绍

多态是指不同对象调用同一函数时,表现出不同的行为。在继承体系中,构成多态要满足两个关键条件:1必须通过基类的指针或引用调用虚函数只有通过基类的指针或引用,才能在运行时根据对象的实际类型来决定调用哪个版本的虚函数(这一过程称为动态绑定)2被调用的函数必须是基类的虚函数,派生类必须重写基类的虚函数虚函数:被virtual修饰的类成员函数。

2025-11-02 20:45:44 861

原创 继承的介绍

建议使用组合,其耦合度低,代码维护性好。1基类private成员的不可见性,基类的private成员继承到派生类对象中,但语法上禁止派生类访问。派生类有六个默认成员函数(构造,析构,拷贝构造,operatoe=,取地址,const取地址)。B和C的虚基表指针指向虚基表,虚基表存储了共享到A成员的偏移量,从而保证B和C访问的是同一份A。派生类和基类之间存在赋值兼容规则,但是仅支持从派生类对象向基类对象的切片转化,反之不允许。派生类构造函数会先自动调用基类的析构函数,保证先清理派生类成员,再清理基类成员。

2025-10-29 16:33:08 911

原创 list的介绍

list的底层是双向循环列表,每个节点包含:数据域:存储元素值。前驱指针(prev):指向前一个节点。后继指针(next):指向后一个节点特点:节点在内存中不连续,通过指针链接任意位置插入 / 删除只需修改指针(时间复杂度 O(1))

2025-10-26 09:12:14 443

原创 vector的介绍

/空vector//初始化n个值为val的元素//用迭代器范围初始化//列表初始化//拷贝构造,拷贝v4的所有元素构造一个空的 vector,里面没有任何元素int main()cout<<"v1的大小是"<<v1.size()<<endl;return 0;构造一个 vector,其中包含 n 个值为 val 的元素。如果没有指定 val,则使用元素类型的默认构造值cout<<endl;

2025-10-21 14:57:41 691

原创 string类介绍

1 string是表示字符串的字符串类2 该类的接口与一些常见的容器接口相同,添加了一些专门操作string的常规操作3在使用string类的时候,必须加上#include<stdio.h>和using namespace std;

2025-10-18 23:48:57 920

原创 模板的介绍

类模板是一种通用的类定义,它不是一个具体的类,而是一个模具,通过指定不同的类型参数,编译器会根据这个模具生成具体的类。class 类模板名//类内成员函数定义vector类模板成员变量private:T* _pData;构造函数析构函数//类内声明~Vector();//类外定义template<class T>//必须再次申明模板参数列表Vector<T>::~Vector()//Vector<T>表示T类型实例化的Vector类if(_pData)

2025-10-17 14:49:23 259

原创 c/c++内存管理

new/delete除了会开空间,还会调用构造函数和析构函数int main()free(p);delete p1;new的原理new的原理就是先调用operator new函数,这一步只负责申请一块足够大的内存,和malloc类似,但是失败的时候会抛异常。operator new(size_t T)本质是一个库函数。然后初始化对象,在已经分配的内存上调用构造函数,内存分配成功之后,编译器会在这篇区域自动调用构造函数,完成对象的初始化。delete的原理delete的过程也分为两步。

2025-10-16 09:19:19 492

原创 string函数的深拷贝

【代码】string函数的深拷贝。

2025-01-30 22:42:41 169

原创 排序(3)

【代码】排序(3)

2025-01-26 20:05:39 138

原创 排序(3)

【代码】排序(3)

2025-01-13 23:03:21 173

原创 二叉树的oj题

思路:从根节点开始,递归地对树进行翻转,如果被遍历的节点的左右节点都已经被翻转,那么我们只要翻转左右子树的位置,就可以完成以root为根节点的树的翻转。只要没有找到左右节点都为空的节点,就继续深入函数内部探测。

2025-01-13 10:32:15 167

原创 vector类介绍

include <iostream> // 引入iostream库以使用cout#include <vector> // 引入vector库// 使用std命名空间,避免每次调用标准库时都写std::// vector的构造// 构造一个空的int类型的vector// 构造一个包含4个元素,每个元素值都为100的int类型的vector// 通过迭代器构造,复制second中的所有元素到third中// 通过拷贝构造函数,构造一个third的副本fourth。

2024-08-30 21:47:30 1188

原创 STL介绍以及string类

是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

2024-08-18 21:54:05 1070

原创 模板初阶介绍

class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)

2024-08-13 20:14:32 943

原创 c/c++内存管理

1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对 该段内存的控制,因而造成了内存的浪费。

2024-08-13 14:58:15 1035

原创 类和对象(3)

才用该自定义类型就可以实例化具体的对象。

2024-08-12 20:49:42 851

原创 类和对象(2)

大多数情况,构造函数都需要我们自己去实现,少数情况类似MyQueue且Stack有默认构造时,MyQueue自动生成就可以用。

2024-08-10 21:23:27 646

原创 堆的介绍~

堆的逻辑结构是一棵完全二叉树堆的物理结构是一个数组通过下标父子节点关系:leftchild=parent*2+1。

2024-07-28 10:38:05 851

原创 类和对象(1)

/由成员函数和成员变量组成类体中的内容称为类的成员,类的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数。1类的声明和定义全部放在类体当中,需要注意的是,如果函数在类中定义,编译器可能会将其当作内联函数处理。int age;2类的声明放在头文件中,类的函数放在源文件当中。注意:成员函数之前需要加类名::声明放在person.h文件当中public:public:char* _sex;int age;

2024-07-19 16:18:56 1116

原创 c++基础

命名方法:使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。命名空间中可以定义变量/函数/类型int val;引用不是定义一个新的变量,而是原有的变量有了新的别名,并不需要为这个别名开辟一个新的空间,它和引用的变量公用一块存储空间。引用类型&引用变量名=引用实体名;int &ra=a;引用变量必须和引用实体是同种类型的。

2024-07-16 22:08:25 809

原创 排序(2)

那么当我们解决下面这个问题的时候:当开始时,begin=0,end=7,mini=begin=0,maxi=begin=0。i=1,1小于0,所以mini=1。此时最大值是9(begin),最小值是1(i)。当begin和max重合,就会出现4 3 5 6。

2024-07-07 17:22:53 499 2

原创 排序(1)

接下来,我们就来到了排序的章节,嘿嘿!加油!

2024-07-05 10:39:56 419

原创 二叉树(2)

二叉树的销毁分为三个部分的销毁:根节点,左子树和右子树层序遍历(上一层带下一层)队列里面的指针指向树的节点,把节点释放掉,不会影响到树的节点。判断二叉树是否为完全二叉树:1、层序遍历走,空也进队列2、遇到第一个空节点时,开始判断,后面全空就是完全二叉树,后面有非空就不是完全二叉树。不可能出现,遇到空时,后面还有非空没进队列。后面非空,一定是前面非空的孩子。当层序出到空的时候,前面非空都出完了,那他的孩子一定进队列了。那么这时候就不需要担心。

2024-07-02 17:17:46 456

原创 二叉树(1)

十分抱歉,停更了差不多一个月。暑假了,我又回来了!

2024-06-30 22:52:22 920 1

原创 栈与队列(2)

head==tail是空还是满呢 方法一:额外多开一个空间。队列 如队列顺序1 出队列顺序1。栈 入栈顺序1 出栈顺序N。队列的作用是用来保持公平性。方法二:增加一个size。

2024-05-17 15:31:44 401

原创 栈和队列(1)

栈是一种特殊的线性表,只允许在一端进行插入和删除操作。如果不在缓存,就叫作不命中,要把数据从内存加载到缓存,再访问。第一步:左括号入栈,第二步:出栈顶的左括号判断和右括号是否匹配,如果匹配,继续,如果不匹配,终止。栈的实现可以用数组或者线性表实现,相对而言,数组实现更优,因为数组在尾上插入的代价较小。以上代码测试出如果是一样的,那么就是原地扩容,如果不一样,就是异地扩容。现在是个激动人心的时刻,因为我们来到了栈和队列的章节。出栈:栈的删除操作叫作出栈,出栈也在栈顶。异地扩容就是在新的地方开辟一个新的空间。

2024-05-15 16:15:33 460 1

原创 链表带环问题

(慢指针有没有可能在环里走了好多圈呢,没有可能,如果走了好多圈,fast一定会超过slow。假设slow进环时,slow和fast之间的距离是N。假设slow进环的时候,fast跟slow的距离是N,fast追击slow距离变短。假设slow一次走一步,fast一次走三步,假设fast和slow之间的距离是N。若C-1是偶数,那么追得上,若C-1是奇数,那么又再一次追不上了,陷入死循环。2slow一次走1步,fast走3步,4步,5步可以吗?fast走的距离是x的三倍,3L=L+X*C+(C-N)。

2024-05-13 20:00:51 367

原创 日拱一卒,月进一步(16)

从i=0开始,并判断nums[i]

2024-05-06 20:30:18 510 3

原创 日拱一卒,月进一步(15)

再依次在满足条件的矩形内+1,最后找出最大数字的个数。首先将数组排序,如果数组中全是非负数,那么排序后的后三个数相乘即为最大值,如果全为非正数,那么最大的三个数相乘也为最大值。2此地有花 因为这是从前往后判断,所以当判断上一块地可以种花时,而这块地已经有花了,上块地就不能种花了,count--综上,我们在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。2)上一块地没有花,这块地能种花,count++1此地无花 1)上一块地有花,这块地·不能种花。

2024-05-04 23:30:19 242

原创 日拱一卒,月进一步(14)

快排并从第一位开始隔位取数字。

2024-05-03 22:06:50 231

原创 日拱一卒,月进一步(13)

【代码】日拱一卒,月进一步(13)

2024-05-03 19:30:29 431

原创 模拟实现memcpy,memmove,memset,memcmp

使用注意事项:从source的位置向后复制num个字节数据到destination所指向的内存位置中。这个函数遇到如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。\0并不会停下。当source和destination有一定的重叠,复制的结果都是未定义的。

2024-05-03 15:35:05 302

原创 日拱一卒,月进一步(12)

【代码】日拱一卒,月进一步(12)

2024-05-02 17:07:17 255

原创 日拱一卒,月进一步(11)

再用differ标记不同的元素个数当前一个元素不等于后面一个元素,differ++,当differ等于2时候,且此时后一个元素仍然不等于前一个元素,就说明这个数字是第三大的元素。然后,我们再次遍历数组,找到那些未被取反(或未被标记)的索引,它们对应的值就是缺失的数字。有些元素出现了一次,有的元素没有出现过,要求找到没有出现过的数字。qsort(首元素地址,元素个数,字节数,比较函数)先用qsort函数,将数组的元素从小到大排序。本身的索引和值之间的关系来找到缺失的数字。上,并将该索引处的元素。

2024-05-02 14:17:48 213

原创 日拱一卒,月进一步(10)

最朴素的思想是存储数组nums的值,每次调用sumRange时,通过循环的方法计算数组nums从下标i到下标j的元素和,需要计算j-i+1个元素的和。因此,要计算sumRange(i,j),则需要计算数组nums在下标i-1和j的前缀和,并计算两个前缀和的差。即可满足调用sumRange的时间复杂度都是O(1)。具体实现方面,假设数组的长度nums等于n,创建长度为n+1的前缀和数组nums,sums[i+1]=sums[i]+nums[i],则sums[i]表示数组从0到下标i-1的前缀和。

2024-05-01 22:11:02 282

原创 日拱一卒,月进一步(9)

右指针不断向右移动,每次右指针指向非零数,将左右指针对应的数字交换,并且左指针右移。这种移动的题目我们首要的想法就是利用双指针。左指针指向已经处理好的序列的。每次交换都是左指针的0与右指针的非0数交换,因此非0数的顺序不变。2右指针right左边直到左指针均为0。1左指针left左边均为非零数。首先祝大家五一劳动节快乐!,右指针指向待处理序列的。

2024-05-01 21:02:05 289 1

原创 日拱一卒,月进一步(8)

这个题目一出现,我就立马有了思路。其实就是让每个数字互相异或,最后得出的数字就是只出现一次的数字。投票算法可以省略循环中不必要的比较,那么我们就开始学习这是如何完成的吧。

2024-04-30 16:33:15 196

原创 日拱一卒,月进一步(7)

为了使买股票利润最大化,应该在下标[0,i-1]选择最小值作为price[j]。遍历所有可能卖出股票的日期,即可得到最大利润。(1)使用prices[i]-prevMin更新最大利润。(2)将prevMin的值更新为prices[i]。遍历结束后即可获得最大值。

2024-04-30 14:32:53 219

空空如也

空空如也

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

TA关注的人

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