自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不 良的博客

晨钟暮鼓,安之若素

  • 博客(71)
  • 收藏
  • 关注

原创 【数据结构】二叉树

/堆中存储数据的类型//存储数据的数组//当前堆的最大容量int size;//堆中元素的个数}HP;//初始化函数//BTree.h}BTNode;//开辟空间if (newnode == NULL) //开辟失败直接结束程序exit(-1);//初始化为空//把二叉树结构连接起来//前序遍历return;//根 左子树 右子树//打印当前结点值//遍历左边结点//遍历右边结点//中序遍历return;

2023-09-17 11:58:39 510 2

原创 【实战项目】云备份

服务端对上传的文件进行备份存储,服务器会分辨文件是否是一个热点文件(即近期是否被访问,没有被访问过就认为是一个非热点文件),对于非热点文件会压缩存储更节省服务器的磁盘空间,对于压缩的文件当我们下载的时候会进行解压之后才下载。然后可以通过浏览器进行访问服务器并且支持下载文件,服务端给浏览器展示一个文件展示的网页,看到网页之后知道有哪些文件可以下载,下载时如果中断了还可以支持断点续传的功能,服务器上面会对上传的文件进行热点管理,会对不被。

2023-09-11 20:24:36 755 1

原创 【实战项目】同步&异步日志系统

⽣产环境的产品为了保证其稳定性及安全性是不允许开发⼈员附加调试器去排查问题,可以借助⽇志系统来打印⼀些⽇志帮助开发⼈员解决问题上线客户端的产品出现bug⽆法复现并解决(出现错误并且不能通过少量测试找到bug),可以借助⽇志系统打印⽇志并上传到服务端帮助开发⼈员进⾏分析对于⼀些⾼频操作在少量调试次数下可能⽆法触发我们想要的⾏为(复现困难),通过断点的暂停⽅式,我们不得不重复操作⼏⼗次、上百次甚⾄更多,导致排查问题效率是⾮常低下,可以借助打印⽇志的⽅式查问题。

2023-09-11 20:21:53 1003 1

原创 【Linux】Linux工具篇(yum、vim、gcc/g++、gdb、Makefile、git)

Linux环境基础开发工具yum、vim、gcc/g++、gdb、Makefile、git的介绍和使用

2023-08-17 17:43:08 2256 17

原创 【数据结构】二叉搜索树

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树,二叉搜索树还有一个特征:按照中序走的话是一个升序的状态。所以二叉树搜索树可以叫做二叉排序树或二叉查找树……

2023-08-16 20:29:28 806 4

原创 【数据结构】八大排序详解

排序就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前(相同的数据,保证排序前后它们的相对位置不变),则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据……

2023-08-14 19:52:49 2311 11

原创 【C++】STL——set和map及multiset和multimap的介绍及使用

在前面学过的STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。本篇介绍的set和map就是关联式器。关联式容器中数据和数据之间有非常强的关联关系,不能随意插入。键值对:用来表示具有一一对应关系的一种结构,该结构中一般只包含两个

2023-08-03 16:46:23 560 11

原创 【C++】多态

多态的概念:简单来说,就是多种形态,具体点就是去完成的某个行为,当不同的对象去完成时会产生出不同的状态。比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买时是优先买票。这就是一种多态行为。多态的定义和实现。多态的构成条件;多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:1、必须通过基类的指针或者引用调用虚函数;2、被调用

2023-07-29 08:20:39 911 45

原创 【C++】继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,而继承便是类设计层次的复用。例如当我们想实现一个学校人员的管理系统,其中每个对象类都具有一些相同的属性(校长、辅导员、学生都具有姓名,年龄等这些相同的的属性),有些类型具有共性,我们把这些公有的属性提取出来都放到一个类中,让其他的类去继承,继承……

2023-07-27 08:39:02 821 28

原创 【C++】string类模拟实现

string类底层是字符数组,所以我们可以根据库中的string类来定义模拟实现的string类中的成员变量。模拟实现string析构函数、拷贝构造函数、赋值运算符重载、访问及遍历函数、重载运算符[]、迭代器函数begin和end;容量相关函数:size函数、capacity函数、empty函数、clear函数、reserve函数、resize函数;修改操作相关函数:push_back函数、append函数、+=运算符重载、c_str函数、find函数、insert函数、swap函数、erase函数……

2023-07-20 12:03:39 947 49

原创 【C++】模板进阶—非类型模板参数、模板特化及模板的分离编译

模板进阶—非类型模板参数、模板特化及模板的分离编译。模板参数可分为类型形参和非类型形参。类型形参: 出现在模板参数列表中,跟在class或typename关键字之后的参数类型名称。非类型形参: 就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用……

2023-07-18 09:23:07 1141 19

原创 【C++】priority_queue使用与模拟实现

1、priority_queue(优先级队列)是一种容器适配器,底层是一个完全二叉树的大堆(堆总是一颗完全二叉树,根结点最大的堆叫做大堆;根结点最小的堆叫做小堆),头文件在中,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。不按照先进先出,优先级高的先出,默认数字大的优先级高。2、类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。3、优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,priority_queue提供一组特定的成员函数

2023-07-13 21:29:46 893 31

原创 【C++】STL——stack和queue使用及模拟实现

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作……

2023-07-10 20:57:08 711 27

原创 【C++】list模拟实现

list相当于带头节点的双向链表,我们定义节点时要用类模板参数,同时定义_next、_prev指针和数据_data,使用struct定义类,因为节点类要能够被访问,而struct的默认访问权限就是public;构造函数缺省值要使用匿名对象,保证无论是自定义类型还是内置类型都能够构造成功……

2023-07-08 21:02:39 968 12

原创 【数据结构】循环队列

队列又称为"先进先出(FIFO)"线性表:插入操作只能在队尾进行,删除操作只能在队首进行。而循环队列是队列的一种特殊形式,循环队列(也被称为环形队列)是一种线性数据结构,其操作表现基于先进先出原则,并且队尾被连接在队首之后以形成一个循环。循环队列固定大小,空间能够重复利用。循环队列可以用数组或者链表实现,那下面我们来分析一下哪种方式更好:当我们想使用链表实现时,假设我们想要开辟的队列长度为k = 4;front表示队头指针,rear表示队尾指针:由上图可知,当rear和front 都指向同一个位置时队列为空

2023-07-07 21:31:24 4568 7

原创 【C++】STL——list介绍及使用

list是一种可以在常数时间复杂度O(1)内对任意位置进行插入删除的序列式容器,并且该器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方代。与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高。list和forward_list最大的缺陷是不支持在任意位置的随机访问,其次,lis……

2023-07-06 08:12:20 1115 40

原创 【C++】vector模拟实现

为了防止与标准库当中的vector产生命名冲突,模拟实现时需放在自己的命名空间当中。从库中的代码可以看出iterator是T类型的指针,但是VS中的不是原生指针,所以不要只认为iterator就是指针。start指向的是容器中第一个元素;finish指向的就是最后一个元素的下一个位置;指向的是整个数组的下一个位置。函数能看出指定对象类型。所以当我们模拟实现vector时,可以将成员变量设置为模板类型的指针_start_finish和。

2023-07-04 23:47:32 853 38

原创 【C++】vector介绍及使用

vector 是一个类模板,可以根据不同的模板参数实例化出存储不同数据的类。 vector 类可以用来管理数组,与 string 类不同的是,string只能管理 char 类型的数组,而vector可以管理任意类型的数组,vector 类相当于一个动态增长的顺序表。类模板中有两个参数:第一个是数据类型,第二个是空间配置器。1.vector是表示可变大小数组的序列容器。2.vector就像数组一样,vector也采用连续存储空间来存储元素,也就意味着可以采用下标对vector的元素进行访问,和数组一样高效。

2023-07-03 20:20:28 581 25

原创 【C++】string类常见题目详解

题目列表:仅仅反转字母、字符串中的第一个唯一字符、字符串最后一个单词的长度、验证回文串、字符串相加、反转字符串……

2023-06-26 10:32:03 1099 22

原创 【C++】STL——string类详解

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。C语言中字符串数组不方便修改,所以C++提供了一个string类。由于历史原因string类比STL产生的早一些,所以……

2023-06-24 19:02:31 1503 31

原创 【C++】模板初阶——函数模板和类模板

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。模板可分为类模板和函数模板。函数模板概念函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版。template叫做函数模板的参数列表使用template关键字定义模板,具体的数据类型是什么由需要确定。模板仅仅对后面紧跟的那个函数起作用,当再定义新的函数后需要重新定义模板。注意typename是用来定义模板参数的关键字,也可以用class代替,但是不能……

2023-06-23 16:35:36 602 14

原创 【C++】内存管理

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。new和delete、new[]和delete[]都是操作符,而malloc/realloc/calloc/free都是函数。new和delete操作内置类型……

2023-06-22 09:09:34 655 25

原创 【C++】日期类常见题目详解

求1+2+3+...+n、计算日期到天数转换、日期差值、打印日期、日期累加。内部类的方法进行求解,通过调用n次构造函数来计算和,从_i = 1开始计算,每调用一次构造函数_i++一次,一共调用n次构造函数,也就计算出1+2+……+n……

2023-06-21 09:36:53 1201 3

原创 【C++】类和对象超全超详细总结(万字详解)

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。如我们平时洗衣服,按照面向过程的步骤即是:拿盆子 —>放水 —>放衣服 —>放洗衣粉 —>手搓 —>洗净拧干 —>晾衣服。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 而洗衣服如果是使用面向对象的方法:C++兼容C结构体的用法在C语言中是类型,C语言中不支持在结构体里面定义函数;在C++中把结构体升级成了类,是声明类,在结构体里面不需要加,本身就是类型,同时在C++中还支持定义函

2023-06-20 20:57:06 375 12

原创 【C++】类和对象(下)

构造函数体赋值、初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式;explicit关键字:构造函数不仅可以构造和初始化对象,对于单个参数的构造函数,还支持隐式类型转换(C++98),C++98不支持多个参数的构造函数隐式类型转换、声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化……

2023-06-20 19:18:49 513 21

原创 剑指 Offer 30. 包含min函数的栈

思路一:栈和辅助栈,栈是先进后出的结构。1.定义两个栈,st和min_st,st用来存储插入的元素,min_St用来存储已插入元素中最小的值,在构造函数中,先在min_st中插入一个值,INT_MAX是整形最大值,方便后续比较;2.在插入函数中,当要插入新的数据时比较min_st栈顶的元素和当前要插入st栈中的元素,将两者中小的压入到min_st栈中;3.删除函数中,当要删除st栈中的元素时,也要删除对应的min_st中栈顶的数据,保证min_st栈中的数据时st栈中存在的;4.top和min函数直……

2023-06-19 10:20:40 265 12

原创 【C++】类和对象(中)

介绍了类的6个默认成员函数(构造函数、析构函数、拷贝构造函数以及取地址重载)的概念及特性和使用场景;运算符重载以及通过实现日期类来完成对类的默认成员函数和运算符重载的认识和熟悉,包含实现日期类的各个函数功能以及具体代码。构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。无参的构造函数、全缺省的构造函数以及用户不写编译器自动生成的构造函数被称为默认构造函数。默认构造函数只能有一个,也就是说无参的构造函数和

2023-06-05 17:50:45 672 29

原创 剑指 Offer 09. 用两个栈实现队列

双栈。栈是先进后出的机构,队列是先进先出的结构。CQueue()作为一个构造函数,在本题中不用管。1.定义两个栈pushst和popst,将pushst栈作为输入栈用于appendTail操作,popst栈作为输出栈用于deleteHead操作;2.进行appendTail操作时,直接将数据压入pushst栈中;3.进行deleteHead操作时:先检查popst和pushst是否为空,如果为空直接返回-1;如果popst为空且pushst不为空,将pushst中的数据从栈顶开始放入

2023-06-04 16:40:48 634 17

原创 剑指 Offer 57. 和为s的两个数字

双指针法:定义两个指针分别指向数组的首元素和尾元素,然后让两个指针指向的元素相加和target比较大小并根据比较结果移动指针,情况分为以下几种:如果两边指针指向的元素相加比target大,即nums[left] + nums[right] > target,那此时需要向左移动right指针,即right--;如果两边指针指向的元素相加比target小,即nums[left] + nums[right] < target,那此时需要向右移动left指针,即left++;如果两边指针指向的元素相……

2023-06-03 08:30:00 542 25

原创 剑指 Offer 22. 链表中倒数第k个节点

思路一:1.先定义一个节点cur,cur = head,然后向后遍历一遍链表,算出链表中元素个数count,如果链表为空,则直接返回nullptr;2.链表的尾节点是倒数第1个节点,那么倒数第k个节点从头节点开始数也就是第count - k个节点;3.再让cur = head,从头开始遍历找到第count - k个节点,返回第count - k个节点就是链表中倒数第k个节点。思路二:双指针法:1.设置快慢指针fast和slow,让fast = head; slow = head;2.让fast指针先向后走

2023-06-02 15:02:48 226 30

原创 剑指 Offer 39. 数组中出现次数超过一半的数字

思路一:要找出在数组中出现次数超过数组长度的一半,可以利用算法库中的`sort`函数将数组排序后中间的数据就是要找的数据;再对数组进行遍历统计中间数据出现次数是否超过数组长度一半。思路二:消除不相等的,最后剩下的就是出现次数最多的。众数:一组数中出现次数最多的那个数;本题中出现次数超过一半的数字就是众数。如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。如示例中[1, 2, 3, 2, 2, 2, 5, 4, 2],每次消去两个不相……

2023-06-01 20:33:27 722 26

原创 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

双指针:设定两个指针`left`和`right`分别指向数组的左边和右边,然后通过计算判断数组中这两边是奇数还是偶数并且分情况进行操作: 当`nums[left] % 2 = 0 `即左边为偶数且`nums[right] % 2 = 1`即右边为奇数时,交换然后移动左右指针;- 当`nums[left] % 2 = 1 `即左边为奇数时,`left++`即可,因为此时如果当`nums[right] % 2 = 1`,那么`right`指针是不能移动的,所以只要当`nums[left] % 2 =

2023-06-01 08:49:05 422 28

原创 剑指 Offer 52. 两个链表的第一个公共节点

双指针法:1.先定义两个指针fast和slow分别记录链表中当前节点,再定义两个变量nA和nB用来记录链表中节点个数;2.然后分别遍历这两个链表,统计链表中节点个数,然后计算出节点个数差值dif并让节点个数多的链表先向前移动dif步;3.再然后就是让两个指针同时向后移动,当两个指针相等时指针指向的就是两个链表的第一个公共节点。哈希集合:unordered_set容器即无序set容器,和set容器唯一的区别就是set容器会自行对存储的数据进行排序,而unordered_set容器不会……

2023-05-31 20:20:13 795 12

原创 剑指 Offer 25. 合并两个排序的链表

思路一:申请一个头节点preHead,然后再申请一个节点prev,让prev = preHead,然后通过向后遍历和比较l1和l2两个链表,同时将其中值较小的节点链接到prev的后面,直至将其中一个链表遍历结束。当其中一个为空之后,找出哪个不为空,然后将该链表接入到新链表中。注意返回的时候返回的是头节点的下一个节点即preHead->next……

2023-05-30 08:00:00 441 8

原创 剑指 Offer 06. 从尾到头打印链表

思路一:使用reverse函数完成链表的逆序打印。我们通过遍历将链表中的值插入数组中,然后使用reverse完成数组元素的翻转,对数组元素翻转之后打印出的数组元素顺序即是链表从尾到头打印的顺序;思路二:我们可以通过修改链表中next指针的指向,先将链表反转,假设原链表为1->2->3->4->5->nullptr,反转后为5->4->3->2->1->nullptr;然后我们再申请一个数组,通过遍历新链表中的值放入数组中,此时数组中的值就已经是原链表中从尾到头的值;思路三:根据栈的先进后出……

2023-05-29 10:00:00 840 14

原创 剑指 Offer 18. 删除链表的节点

双指针法:因为题目中保证链表中节点的值互不相同,所以我们可以通过比较链表中节点值是否和val相等来删除节点。链表头节点为空的情况就不再细说,直接返回nullptr,情况1.先判断头节点是否等于val,如果等于val直接返回头节点的下一个节点即返回head->next;情况2.如果头节点不等于val,则设置两个节点prev和cur分别记录上一个节点和当前节点,如果cur节点的值等于val,则prev节点的next指针指向cur节点的下一个节点即

2023-05-28 18:53:02 1045 9

原创 【C++】类和对象(上)

C++类和对象上主要内容为:面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装、类的作用域、类的实例化、类对象模型和this指针……

2023-05-28 10:24:02 1419 17

原创 【C++】C++入门

C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。C++入门知识包括C++关键字、命名空间、输入和输出的使用、缺省参数、函数重载、引用、内联函数以及C++11中涉及到的auto关键字、基于范围的for循环和指针空值nullpttr……

2023-05-26 18:45:34 1240 29

原创 剑指 Offer 58 - I. 翻转单词顺序

逆序双指针:1.用n记录当前字符串长度,再开辟一个新的字符串str用来存放逆序遍历到的单词;2.逆序遍历,当字符不为空格时,使用right记录下当前i的位置,然后i--向前查找下一个空格,当s[i] == ' '时,可以通过right - i 得到当前单词的长度,i + 1得到单词的首字母,通过substr函数将该单词放到新的字符串str中;3.当我们逆序遍历完成之后,得到新的字符串,此时str已经是原来字符串翻转后形成的……

2023-05-25 11:27:25 1212 14

原创 剑指 Offer 24. 反转链表

双指针法:可以通过改变链表中节点的next指针的指向从而实现链表的反转,1.设置两个节点prev和cur,cur表示当前节点,prev表示当前节点的上一个节点,初始状态设置为prev = nullptr; cur = head;再设置一个结点tmp记录cur的下一个结点,即tmp = cur……递归:递归法和双指针法的逻辑相同,也是通过改变指针的指向从而实现反转。1.递归函数中当cur不为空的时候,先记录下cur节点的下一个节点,再改变cur节点的next指针使其指向prev……

2023-05-23 17:31:38 833 29

空空如也

空空如也

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

TA关注的人

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