自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 继承

public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象组合是一种has-a的关系。假设B组合了A,每个B对象都有一个A对象。继承是一种白箱复用,父类对于子类基本是透明的,但是它一定程度破坏父类封装组合是一种黑箱复用,A对B是不透明的,A保持着它的封装组合的类耦合度更低,继承的类是一种高耦合面试题:使用继承还是组合呢?答:不能一概而论,根据使用场景,符合is-a就使用继承,符合has-a就使用组合,都符合就优先使用组合。

2024-05-17 19:15:28 581

原创 动态规划题集

本文是关于动态规划章节的题集,题目由浅到深,只有自己做过才能体会到。

2024-05-13 21:36:52 676

原创 list

对于vector进行插入和删除时,(当插入操作时,有可能空间不够,需要增容,那么当前迭代器指向的空间就被释放了)迭代器会失效,需要对迭代重新赋值。2、插入数据时,当空间不够需要增容。开辟新的空间,拷贝数据,释放旧空间,代价很大。list底层空间是一个一个的动态开辟的结点,容易造成内存碎片,空间利用率低。vector底层空间是一块连续的空间,不容易造成内存碎片,空间利用率高。1、头部和中部的插入和删除效率低,因为需要挪动数据。2、插入数据时,不需要增容,新增一个结点即可。缺点:不支持随机访问。

2024-05-13 13:47:12 227

原创 vector

vector() 无参构造vector(size_type n, const value_type& val = value_type()) 构造并初始化n个valvector (const vector& x) 拷贝构造。

2024-05-10 19:25:35 1085

原创 string

string() 构造空的string类对象string (const char* s) 用c_string来构造string类string(const string& s) 拷贝构造string s1;// 用C格式字符串构造string类对象s2。

2024-05-08 15:23:36 515

原创 模板

在C语言中,想要实现多种类型的变量交换,需要用户定义需要实现交换的类型的函数。用户自定义一个栈的数据结构,只能用于一种类型的使用,如果想要在一个程序中定义多种类型的栈,C语言是办不到的。那么在C++中就引入了模板。

2024-05-03 15:14:09 843

原创 内存管理

int main()// malloc和new最大区别就是new会调用构造函数,free和delete的最大区别就是delete会调用析构函数。// p1是一个整型指针,存储在栈区,p1存的内容是一个指针,该指针指向在堆区开辟的内容。free(p1);delete p2;return 0;

2024-05-03 14:24:59 729

原创 单调栈

单调栈就是用来存放已经遍历过的元素。当解决问题需要记录前面的元素,这个时候就需要用到单调栈。比如求一个数组中一个元素后面第一个大于它的元素。可以使用暴力去遍历,但是会出现重复判断,性能不优。这个时候用一个单调栈来存放已经遍历过的元素。这样来看我们可知根据题目要求,单调栈里面可以存放元素的下标也可以存放元素值。

2024-04-30 22:33:08 104

原创 图论题集

给定一个graph,题目要求从结点0到n - 1的结点的所有路径。这个n指的是graph的行下标。拿一组测试用例来说明吧。不然不好理解题意题目大致就是这么个意思。题目保证了输入为有向无环图。那么就可以确定,一定会有结点0到n的路径。这很辛苦,但我觉得对于初学者来说,很有必要。一步一步分析递归和回溯,这样才能更好的理解dfs。多分析个几次,就回慢慢变快了。

2024-04-30 22:32:33 158

原创 类和对象

1、声明和定义全部放在类体中(注意:成员函数在类中定义,编译器可能会当初。

2024-04-25 17:55:59 385

原创 内联函数、auto关键字、范围for、nullptr

将一个函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开。这样就没有函数调用建立栈帧的开销,可以提升程序运行的效率。一般来说,内联机制用于优化规模较小(即函数不是很长,没有具体的说法,取决于编译器内部的实现)、流程直接、频繁调用的函数。inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

2024-04-24 13:42:04 210

原创 排序

选择排序是寻找数组中的最大值(最小值)的下标,然后交换。当然我们可以优化一下,上面原始做法是找最大值,其实我们可以分区间去找最小和最大,然后把最小值和该区间第一个数交换,最大值和该区间最后一个交换。但是这样写会存在一个问题,就是当maxi的位置和begin的位置相同,mini的问题和end的位置相同,那么就会重复交换,相当于两次交换的同样的位置,那么没有起到交换的作用。

2024-04-18 21:23:35 363

原创

堆分为大根堆和小根堆。堆的结构是一颗完全二叉树。大根堆是父结点大于孩子结点。小根堆是父结点小于孩子结点。这就是一个小根堆这是一个大根堆。

2024-04-17 22:34:15 398 1

原创 贪心题集()

这道题就是要求给定的数组中的峰值数以及端点。把数组抽象成折线图会好理解一些,那么根据题意,我们就需要判断这些相邻的数的差值,不妨设pre_diff = nums[i] - nums[i - 1],cur_diff = nums[i + 1] - nums[i]。那么出现峰值的条件为那么就需要三个数来计算,但是数组假如就只有两个数呢?我们在数组的第一个元素之前引入一个相同的数,所以在开始状态pre_diff = 0。那么就需要修改判断峰值条件了这样就包括了只有两个元素的情况。

2024-04-03 20:07:48 619 1

原创 运算符重载

当我们想进行两个自己创建的类比较时,这个时候" == "不会起作用了,因为这个符号是当我们比较基本内置数据时,系统已经给我们封装好了,可是我们自己创建的类型,系统可没有封装好,所以就需要运算符重载。

2024-04-03 10:03:13 105 1

原创 缺省函数,函数重载,引用

缺省函数又分为全缺省函数和半缺省函数。

2024-04-02 13:21:08 1012 1

原创 内存的四区

内存分为四个区,分别是:代码区、全局区、栈区、堆区。一个程序在运行前分为代码区和全局区,这个时候栈区和堆区还没有创建。

2024-04-01 22:50:37 156

原创 二叉树的前中后序遍历(递归法和迭代法)

三种遍历的递归大差不差,但迭代却有区别,那么在下一期将会更新三种遍历的迭代统一格式。

2024-03-20 21:32:29 311 1

原创 二叉树的基础理论

以上只是二叉树的一些基础理论,两种遍历方式,和二叉树结构的代码实现,将会在之后更新。

2024-03-19 20:34:59 308 1

原创 KMP算法

前缀表(prefix table) :前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。而前缀表内存储的是最长相等前后缀(这里我们定义它为next数组)比如aadaaf:a 前缀: 后缀: 0aa 前缀:a

2024-03-18 08:58:40 537

原创 二分查找(个人笔记)

2、right = mid 还是right = mid - 1:因为是右边是闭区间,所以这里的right是可以取到的,nums[mid]已经判断是不是target的下表,所以下一次要在mid之前搜索,所以是right = mid - 1.假如是左闭右开, 这里right就取不到了,所以是right = mid,因为是左闭右闭,所以left == right是合法的,所以是<=。假如是左闭右开,这里right就取不到了,所以是<。

2024-03-10 21:40:00 188 1

原创 数据结构——树(C语言)

判断该父节点是否为叶子结点(也就是它是否存在子节点),若不存在子节点,则直接把创建好的链表结点(child_node)赋值给该父结点的子结点的头结点(parent->child_head)。若存在子结点,就把该父结点的当前子结点的头结点 修改为创建好的链表结点(child_node) 的下一个结点,然后再把父结点的子结点的头结点更新为创建好的链表结点(child_node)。数据不用多说,子节点链表的头节点:该链表将该结点的下一度子节点都链接起来了。树包含四种节点:父节点,子节点,叶子节点,根节点。

2024-03-03 11:01:58 436

原创 数据结构——栈(用链表实现栈)(C语言)

顺序表和链表实现栈,二者相辅相成,很难说那个更好。先定义链表结构体,在定义栈结构体。

2024-02-28 16:39:31 206

原创 数据结构——栈(顺序表实现栈)(C语言)

若使用链表实现栈,头做栈顶,头插头删,可以设计为单链表。尾做栈顶,尾插尾删,设计为双向链表(否则删除数据效率低)栈好像就是一叠盘子,盘子只能从最上面拿,不可以从中间或者下面。若使用顺序表实现栈,则左边为栈底,右边为栈顶(栈顶出元素)栈可以使用顺序表实现,也可以使用链表实现。栈的重点主要是出栈和入栈。

2024-02-28 16:01:27 190

原创 数据结构——双向链表(C语言版)(带虚拟头节点)

该链表循环,所以在初始化的时候(只有虚拟头节点这一个节点),这个虚拟头节点的next指向自己,prev也指向自己。在pos位置之前插入,首先pos不能为空(不然不知在哪插入元素),否则报错(使用断言能更快发现错误)。循环链表打印的结束标志不像单向链表(NULL),它的结束标志是不等于虚拟头节点。创建一个元素为x的新节点,并把该节点与pos和pos->prev相连接。链表可以分为三大类:循环与不循环,双向和单向,带头与不带头。上期更新了不循环不带头的单向链表,这期为循环带头的双向链表。

2024-02-28 15:18:22 138

原创 数据结构--单向链表(C&&python)(不含虚拟头结点)

该函数修改了结构体,传递一个指针的地址,用一个二级指针接收。如果是一个一级指针接收一个一级指针,这只是临时拷贝。对该指针修改并不会修改链表。重命名一下,后面定义变量和整体的修改更方便。

2024-02-04 01:23:20 214 1

原创 动态内存管理(C语言)

当使用free释放时,指针必须指向首地址,上述用法是错误的,因为p不断向后移动,最后不是首地址,应该p[i] = i或者*(p+i) = i。这个函数实现原理:如果ptr之后的空间足够,在要扩充的空间之后扩充。如果不够,重新开辟一个新的空间,并把ptr原内容复制到新空间之前。如果ptr是一个空指针,那么realloc等同于malloc。ptr指向的空间,必须是一个动态开辟的空间。释放指针,需把该指针变为NULL。

2024-02-02 21:04:31 111

原创 数据结构--顺序表(C&&python)

而温柔方式和暴力方式的区别是:当顺序表中元素不足时,温柔方式不会报错,而暴力方式会报错。解释:同样的,在删除之前,判断顺序表中元素是否足够,同样也分为温柔方式和暴力方式,此处省略温柔方式(个人更喜欢暴力处理方式)以上仅是个人(初学者)对与顺序表的初步学习,发布在此,仅是对自己起到一个后期复习和查漏补缺的作用。解释:首先重命名顺序表中元素的类型,这样可以方便管理顺序表中的元素类型,只需将int更改。解释:pos是插入第几个的位置,而不是下标,并且在插入之前判断位置(pos)是否合法。

2024-02-01 22:47:27 105 1

原创 内存函数(C语言)

注意:遇到'\0'并不会停下来,当destination指向的内容和source指向的内容有重叠部分,则不可以使用。也就是说,destination和source指向的内容不可在一个数组中有重叠的部分。并不能修改为全部都是1,而是一个一个字节修改,内容为ox 01 01 01 01,转化为十进制为上述值。该函数是将value的内容赋值给ptr所指向的位置,从后数num个字节。分析:当dest指向在src前面时,应从前往后复制。注意:该函数和memcpy和不一样,可以复制重叠部分的内容。

2024-01-30 16:44:41 159 1

原创 字符串函数(C语言)

该函数实现过程:遍历目标字符串寻找分隔符,找到了则将分隔符赋值为'\0',并记录下该位置,下次利用时,从该位置开始寻找下一个分隔符。(以'\0'为标志,将'\0'之前的字符串都复制给目标字符串)注意:追加在目的字符串的’\0’的后面,并且覆盖’\0’。该函数也就是计算'\0'之前的字符(不包括'\0')注意:1.该函数是在目标字符串的'\0'之后(包括'\0')追加字符串。2.源字符串必须带'\0',并且将'\0'一起追加到目标字符串。注意:假如第三个参数大于源字符串的长度,会用’\0’代替。

2024-01-29 22:38:42 159

原创 在C语言中,x的n次方表示

返回类型是double,在注意使用它的时候是否需要强制类型转换。for example:12345%((int)(pow(10,3)).这里进行取余(%)操作时,两个操作数需为整型(int)。利用pow(x,n)函数。它的完整型是:double pow (double x,double n) 头文件是#include<math.h>

2023-12-18 22:15:00 945

空空如也

空空如也

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

TA关注的人

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