自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux之进程

操作系统就是一个软件,它管理计算机的所有的软硬件资源,包括进程管理,内存管理,文件管理,驱动管理计算机软件体系像我们用过的cout函数就是会贯穿这整一个软件体系。在上面那个图中,操作系统相当于大脑,而驱动程序就相当于四肢,硬件设备就相当于武器,为了很好的管理四肢,就需要用到先描述再组织的方法,就是说大脑先要知道每个肢体的具体属性,然后将他们以结构体的形式描述出来,最后将每个肢体再通过链表的方式组织起来,方便查找管理。在书本中,加载到内存中的程序,就叫做进程。

2023-02-17 15:25:30 321

原创 Linux之进程控制

进程不变,仅仅替换当前进程得代码和数据得技术叫做进程得程序替换程序本质上就是存放在磁盘中的文件,这些文件=程序代码+程序数据,操作系统将该文件中的代码和数据替换到已存在的进程中的代码和数据,这一过程我们称之为程序替换!!他并没有创建新的进程,只是老进程的壳子(进程地址空间,PCB,页表)不变,把新程序的代码和数据替换进物理内存就可以了在上面的代码中,程序替换之后的的代码是不会执行的程序替换的本质就是把程序的进程代码+数据,加载进特定进程的上下文中!!C/C++程序要运行,必须得先加载到内存中!

2023-02-17 15:24:54 460

原创 23.合并K个有序链表

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

2022-12-17 10:54:27 807

原创 34. 在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。

2022-12-17 10:17:11 314

原创 通过连接另一个数组的子数组得到一个数组

首先从遍历Groups数组,从里面取出子数组,然后再子数组与在nums中从i = 0到i = 子数组数据大小构建的vector的nums子数组进行比较,如果一样,则继续提取Groups数组中的下一个子数组,如果不相等,就i++,也就是将子数组与在nums中从i = 1到i = 子数组数据大小构建的vector的nums子数组进行比较,直至i + 子数组数据大小

2022-12-17 00:48:25 87

原创 项目2:负载均衡式的在线OJ服务

实现类似于leetcode的题目列表+在线编程功能。

2022-12-16 15:42:12 285

转载 最长有效括号

这个数组为:2,3,4,5,1,6 这是通过栈找到的,我们按递增排序!接下来我们思考,是否可以省略排序的过程,在弹栈时候进行操作呢?我们先找到所有可以匹配的索引号,然后找出最长连续数列!找出该数组的最长连续数列的长度就是最长有效括号长度!例如:s = )(()()),我们用栈可以找到,所以时间复杂度为:O(n)。所以时间复杂度来自排序:O(nlogn)。对于这种括号匹配问题,一般都是使用栈。位置 2 和位置 3 匹配,位置 4 和位置 5 匹配,位置 1 和位置 6 匹配,

2022-12-13 12:55:30 79

原创 使用滑动窗口法解决无重复字符的最长子串问题

给定一个字符串 ,请你找出其中不含有重复字符的 最长子串 的长度。刚开始的时候,我想采用unordered_set的方法来解决遇到重复字符,就去重的问题,然后剩下来的就是最长字符串,但是没有注意到这里要求的是子串,因为如果用了这种方法,就会造成被去重元素之前的元素不能被除去的问题,也就不能形成子串了 那怎样才能即把重复的字符去掉,还把子字符之前的字符也去掉呢,并且还要记录最长子串的大小,如何做到呢?这里就用到了滑动窗口来解决,既可以去重,又可以记录子字符串的大小,我以字符串"pdvdf"为例子说明,怎么解

2022-12-07 22:03:00 143

原创 C++二叉搜索树

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:(1)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值(2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值(3)它的左右子树也分别为二叉搜索树。

2022-09-08 16:15:44 323

原创 C++多态

通俗点说,多态就是多种形态,具体点说,就是不同的对象,去做同一个行为,产生了不一样的结果,比如抢红包,抢票这些都是多态行为,在C++中,多态就是不同继承关系的类对象,去调用同一个函数,产生了不同的行为,比如Person类对象去调用买票函数,就是买票全价,而Student类对象去调用买票函数。就是买票半价。从上面可以看出,C++

2022-09-02 13:48:02 449

原创 C++继承

C++继承的知识点

2022-05-10 16:27:58 281

原创 C++之利用仿函数和STL容器模拟实现优先队列(priority_queue)

一.仿函数仿函数本质上是一个类的对象模拟实现一个函数的行为,就是在类中实现operator()函数,这个类有类似函数的行为,由仿函数类创建的对象称为仿函数对象,在优先级队列中,通过调用不同的仿函数,可以实现不同类型的优先级队列,以及可以控制优先级排序规则(大堆,小堆)。以优先队列(priority_queue)为例 //仿函数类 template<class T> struct Less { bool operator()(const T& x,

2022-05-06 20:18:36 619

原创 C++之List的模拟实现以及List反转迭代器的构建

C++之List的模拟实现以及List反转迭代器的构建

2022-05-02 17:51:14 1793

原创 C++vector模拟实现增删改查

一.成员变量vector的成员变量有三个,分别是三个类模板参数类型的指针_start,_finish,_endofstorage,它们分别指向vector数组的首个元素,结尾元素的下一个空间,空间末尾。二.构造函数(默认构造,拷贝构造函数,赋值重载函数,迭代器实现构造函数) vector() :_start(nullptr) ,_finish(nullptr) ,_endofstorage(nullptr) {} //使用迭代器完成构造函数,初.

2022-04-27 21:50:51 2165

原创 C++string模拟实现增删查改功能

一.reserve函数1.1功能改变当前sting对象空间容量的大小,如果需要改变的容量大小大于string对象的实际容量,就重新申请空间,扩容,否则就不需要扩容。1.2返回值无返回值1.3实现逻辑(1)判断需要扩容的容量n是否大于当前对象的实际容量(2)在堆上申请大小n为的空间(3)将对象中的字符串拷贝到在堆上新开辟的空间上,并释放该字符串指向的堆上的空间(4)改变当前对象的实际容量值实现代码如下所示 //增容改变空间大小,只有当要增容的空间大小大于当前对象

2022-04-21 22:00:31 1615

原创 C++深浅拷贝

浅拷贝的缺点:对类内的成员变量按字节,一个一个的简单拷贝,这就是浅拷贝,对于日期类对象,没有在堆上创建数据的对象,浅拷贝是可行的,但是对于栈对象,需要在在堆上创建数据的对象,我们需要用到深拷贝来完成对象的拷贝,为了实现深拷贝,我们需要自己实现拷贝构造函数以下面这段代码为例,证明以上发生的错误 class string { public: string(const char* s = "\0")//默认构造初始化 : _size(strlen(s)) ,_capac

2022-04-18 20:49:54 1390

原创 C++迭代器

什么是迭代器:C++中,迭代器就是一个类似于指针的对象,它能够用来遍历C++标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。以下面的string为例子介绍说明。对string 对象s1正向遍历输出,代码如下所示: string::iterator it = s.begin(); //此处的begin()函数有两个重载函数,分别是 //iterator begin(); //const_iterator begin() const; //调用他们的对象,分别是可以

2022-04-18 19:15:46 18405 3

原创 C++之模板

一.泛型编程使用函数重载可以实现不同类型数据的swap交换函数,但是有一些几个不好的地方:1. 重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数2. 代码的可维护性比较低,一个出错可能所有的重载均出错因此我们需要告诉编译器一个模子,需要一种手段来实现代码复用,让编译器根据不同的类型利用该模子来生成代码;为此我们提出了泛型编程的概念。泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。模板又分为函数模板和类模板。...

2022-04-18 16:26:43 147

原创 C++内存管理

一.C++内存分布C++中的,我们所说的内存是虚拟内存,它有4GB的存储空间,它分为内核空间,栈,内存映射段,堆,数据段,代码段这6个模块,他们的功能介绍如下所示:说明:1. 栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)3. 堆用于程序运行时动态内存分配,堆是可以上增长的。4....

2022-04-13 20:08:52 313

原创 C++构造函数初始化列表+Static成员+友元

一.初始化列表1.构造函数体赋初值以下面的代码为例,在类的构造函数中,给对象的成员变量赋初值。class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; flag = 1; } private: int _year; // 声明 int _month; int _day; const int flag;};int

2022-04-12 13:26:07 901

原创 C++const成员函数/取地址运算符重载

一.const成员将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。以下面代码举例说明:总结: 成员函数加const是好的,建议能加const都加上。这样普通对象和const对象都可以调用了。但是如果要修改成员变量函数是不能加的,比如日期类中的+=和++等实现二. 取地址及const取地址操作符重载这两个默认成员函数一般不用重新定义 ,编译器默认会生成。cl..

2022-04-09 21:47:57 1563

原创 C++运算符重载

一.概念C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型operator操作符(参数列表)注意:...

2022-04-07 17:39:12 1132

原创 C++类和对象中篇(构造函数/析构函数/拷贝构造函数详解)

一.类的6个默认成员函数任何一个类,只要被创建,都会自动生成6个默认成员函数二.构造函数1.定义构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。它用于对象的初始化。2.特性构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任务并不是开空间创建对象,而是初始化对象。其特征如下:1. 函数名...

2022-04-06 19:45:52 795

原创 C++之类和对象上篇(类的定义+封装+访问限定符+类的作用域+this指针)

一.类的初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数,以下面的代码为例// struct/class// C++ 兼容C里面结构体的用法// 同时struct在C++中也升级成了类// C++类跟结构体不同是除了可以定义变量,还是可以定方法/函数struct

2022-04-05 20:06:48 662

原创 C++之auto

一.概念什么是auto:在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有 人去使用它,大家可思考下为什么? C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。二.作用1.可以根据右边的值去自动推导it的类型,写起来就方便了int main(){ const int a = 0; int b

2022-04-04 20:54:04 1393

原创 C++内联函数

一.概念以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。为什么要用内联函数呢? 因为调用函数,需要建立栈帧,栈帧中要保存一些寄存器,结束后又要恢复,可以看到这些都是有消耗的。对于频繁调用的小函数,则需要用到内联函数来优化。以下面这段代码为例// 有了inline, 我们就不需要用C的宏,因为宏很复杂,很容易出错inline int add(int x, int y){ int r...

2022-04-04 16:12:17 119

原创 C++之extern C的作用

2022-04-04 15:28:14 820

原创 C++隐式类型转换

以下面这个例子为例,为什么会出现这种现象呢?double d = 11.11;int i1 = d;//这是可行的int& i2 = d;//这是不可行的const int& i3 = d;//这是可行的因为当d赋值给i1的时候会产生一个临时变量,然后将d截断,取整数部分放到这个临时变量中,再将这个临时变量赋值给i1。这个临时变量是右值,具有常量性,即不可被修改,只能读取。那什么是右值呢?右值就是表达式产生的临时变量,常量。结论:const type&amp.

2022-04-03 17:40:51 546

原创 C++之引用

一.引用概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它 引用的变量共用同一块内存空间。 类型& 引用变量名(对象名) = 引用实体,比如:int main(){ int a = 10; int& b = a;//引用取别名,定义引用类型 int* p = &b;//取地址}二.引用需要注意的问题1.引用在定义时必须初始化 //1.引用在定义时必须初始化 int a = 10; int.

2022-04-03 14:26:14 184

原创 C++函数重载

一.函数重载的概念函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的 形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。1.函数参数类型不同//函数重载 -- 类型不同int Add(int left, int right) { return left + right;}double Add(double left, double right) { return left + ri

2022-04-02 16:32:20 3740

原创 C++之缺省参数

缺省参数又叫默认参数,当调用函数的时候,没有赋予参数,就使用函数的默认参数。//缺省参数(也叫默认参数)void func(int a = 0){ cout << a << endl;}int main(){ func(1);//如果传了参数,则a = 1; func( );//如果没有传参数,则a默认等于0; return 0;}当有多个参数的时候, 都可以给缺省值,并且有多种调用方式全缺省://全缺省void func(int a =

2022-04-02 11:55:02 565

原创 C++命名空间

一.什么是命名空间C++命名空间规则是为了解决命名冲突而设定的如果包含了头文件stdlib.h,然后定义一个全局变量rand,就会导致rand重定义命名冲突问题就是指:C++提出了命名空间来解决这个问题,在C++中,命名空间就是用namespace来定义的,它相当于一个域如果在main中用到了rand,则编译器的查找顺序是先从局部找,再从全局找,他不会去自己定义的域里面去找,如果想用自己定义的命名空间中定义的变量,则需要使用域作用限定符::,使用方法(以上图为例)bit:..

2022-04-01 20:11:15 529

原创 排序稳定性分析

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。选择排序做不到稳定,举例说明:那这样,5和5的相对顺序会改变。...

2022-04-01 15:22:41 219

原创 数据结构之计数排序

一.思路通过统计数组中每一个元素出现的次数,然后根据统计的次数进行排序,这样子就能够实现计数排序了,首先找出一个数组中的最大值和最小值,然后创建一个从最小值到最大值的数组,紧接着遍历数组,将数组中的数据,转换成最大值和最小值之间的每一个元素出现的次数,最后将统计数据出现的次数转换成根据统计的次数排序。它适合于数据大小范围比较集中的数组。但是如果数组中的数值很大的时候,就需要开辟很多空间,这就造成了空间浪费,为了避免空间浪费,需要采用相对映射的方法二.代码实现// 计数排序v.

2022-04-01 14:22:13 892

原创 数据结构之归并排序

一.思路当对两个有序的数组进行排序的时候,只需要逐个比较两个数组中的元素,然后将他们按先后顺序填入到临时数组temp中。同理对于一个无序的数列,首先将数组分解成单个元素后,再将数组通过前面介绍的方法合并成一个有序子数列,最后将这些有序子数列归并成一个有序数列,这样子就能够实现数组的归并排序了。​二.代码实现void _MergeSort(int* a, int left, int right, int* temp){ if (left >= ri...

2022-03-31 22:04:36 424

原创 快速排序——hoare版本+挖坑法+双指针法

快排的基本思想是将数组中选出来的key值,通过左右数值比较大小的方式,把该key值调至它应该在数组中的位置(以升序为例)实现hoare版本的快排,需要先实现快排的单趟排序,单趟排序的目标是实现左边的值比key要小,右边的值比key要大。快排的结构图如下所示:单趟快速排序代码如下所示:// 快速排序hoare版本int PartSort1(int* a, int left, int right){ int keyi = left; while (rig...

2022-03-19 20:40:38 795 1

原创 数据结构——直接插入排序,选择排序,冒泡排序对比

由上图可知,常见的排序算法有插入排序,选择排序,交换排序,归并排序,其中直接插入排序属于插入排序,选择排序和堆排序属于选择排序 。横向对比,选择最差,无论在什么数据场景下,这三种排序的最坏的时间复杂度都是O(N^2),...

2022-03-19 14:37:16 1099

原创 数据结构之建堆以及堆排序

一.思路本文以升序为例,进行堆排序讲解。堆排序是建立在大堆的思想上的,通过将数组排成大堆,然后将堆数组中的头元素与尾元素进行交换,最后对除去尾元素外的全部堆数组元素进行大堆排序,如此循环往复,即可完成升序堆排序。 想要实现堆排序,首先就要建大堆,那为什么就不能小堆呢?那是因为如果建小堆,数组头元素即为最小值,然后需要将后面N-1个元素建小堆,这就造成时间复杂度提升到了N^2;所以不能建小堆来排升序。那如何建大堆呢,有两种方法,一种是从下往上建大堆,另一种是从上往下建...

2022-03-18 21:12:13 1883

原创 希尔排序详解

一.思路希尔排序是建立在插入排序的思想之上的,因为插入排序在应对数组接近有序的情况下,时间复杂度接近O(N),故如果对数组先进行预排序,使数组接近有序,再进行直接插入排序,能大幅度降低时间复杂度二.实现首先完成单组实现: int end = 0; int x = a[end + gap]; while (end >= 0) { if (a[end] >...

2022-03-18 12:35:14 725

原创 插入排序的实现

一.思路插入排序顾名思义就是往一堆有序数组中插入一个数,假设将一个数插入到一个升序数组中,需要将该数与该数组中的值,从尾数开始,逐一比较,如果遇到比该数大的值,就将前一个值与该数比较,如此比较下去,直至遇到比该数小的值,然后再将该数插入当前值中。二.代码void InsertSort(int* a, int n){ assert(a); for (int i = 0; i < n - 1; i++) { int end = i; ...

2022-03-17 21:07:50 579

空空如也

空空如也

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

TA关注的人

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