自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网络基础入门

计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式.所谓 “局域网” 和 “广域网” 只是一个相对的概念. 比如, 我们有 “天朝特色” 的广域网, 也可以看做一个比较大的局域网.TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.总结:所谓的网络协议,本质是通过数据的表达方式,来完成参与通信的各个主机协议的表现。路由器:都是每个网络拓扑中的一台机器。

2023-10-24 21:29:39 237

原创 数据结构—排序

排序方法平均情况最好情况最坏情况辅助空间稳定性冒泡排序O(N2N^2N2O(N)O(N2N^2N2O(1)稳定简单选择排序O(N2N^2N2O(N2N^2N2O(N2N^2N2O(1)不稳定直接插入排序O(N2N^2N2O(N)O(N2N^2N2O(1)稳定希尔排序O(NlogNlogNlogN∽\backsim∽O(N2N^2N2O(N1.3N^{1.3}N1.3O(N2N^2N2O(1)

2023-09-10 09:22:21 1431 6

原创 数据结构—循环队列(环形队列)

循环队列选择用数组实现,循环队列需要用一个指针来指向存储队列数据的空间,用两个变量来记录队列中存储数据的起始(对头)和末尾(队尾)的数组位置,最后用一个变量记录队列的存储数据的最大容量。

2023-08-26 19:13:23 3576 12

原创 数据结构—队列

但是注意如果这个接口函数偶尔调用可以用这样的方式实现,如果经常调用这个函数就需要在队列结构体中在添加一个成员size(用来记录数据个数,入队列和出队列的函数都得对size进行操作),这样效率更高。出队列操作首先保存头节点的下一个节点,然后删除头节点,最后将头指针指向头节点的下一个节点即可。否则将新节点直接入队列,更新队列中的尾指针即可。队列也可以数组和链表的结构实现,使用链表(单链表)的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。队列的销毁需要将队列中的所有数据都删除。

2023-08-21 15:36:00 398 4

原创 数据结构—栈

需要用结构体创建一个栈,这个结构体需要包括栈的基本内容(栈,栈顶,栈的容量)。

2023-08-02 10:33:04 331 12

原创 数据结构—链表

中间/头部的插入删除,时间复杂度为O(N),效率比较低(因为需要挪动数据)增容(需要开辟新空间释放旧空间)需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。其中链表就可以很好的解决上面的问题。

2023-07-29 16:46:37 978 12

原创 数据结构—顺序表

如果顺序表的空间足够可以直接将要插入的数据放到数组下标为size的位置上去,同时size++,capacity不需要修改这样就完成尾插了。顺序表的头插数据时需要从后往前挪动数据(如果是从前往后挪动数据会导致所有的数据都会改成第一个元素的值),再将要插入的数据放到数组中的第一个位置上去并将size++。插入数据的过程是将pos位置上的数据到最后的数据依次从后往前挪动,最后再将要插入的数据放到pos位置上,size++即可。注:顺序表要求是一段连续的物理空间(其实是数组),但要求存储的数据是依次连续存储的。

2023-06-28 10:23:01 689 18

原创 数据结构和算法

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。注:数据结构和算法是不分家的,数据结构中包含一些算法一些,而算法的解决又离不开数据结构。注:时间复杂度O(M+N) 或者O(max(M,N))

2023-06-23 12:31:04 1169 19

原创 函数栈帧的创建与销毁

函数栈帧的创建与销毁前言知识储备寄存器三级目录前言本章讲解的函数栈帧的创建与销毁,在不同编译器下,函数调用中栈帧的创建略有差异,具体细节取决于编译器,但大体逻辑是一致的。(在使用编译器时,建议不要使用太高级的编译器,编译器越高级,越智能,越不容易观察。)知识储备寄存器esp,ebp这两个寄存器存放的是地址,这两个地址是用来维护函数栈帧的。esp:栈顶指针ebp:栈底指针三级目录...

2023-06-11 20:36:49 725 27

原创 C语言—程序环境和预处理

预处理 选项 gcc -E test.c -o test.i预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。编译 选项 gcc -S test.c编译完成之后就停下来,结果保存在test.s中。汇编 gcc -c test.c汇编完成之后就停下来,结果保存在test.o中。VIM的相关命令Linux环境基础开发工具使用预定义符号在预处理阶段被处理的已经定义好的这种符号,这些符号是可以直接被使用的。预定义符号是C语言已经内置好的。

2023-06-11 12:38:16 668 8

原创 C语言—文件操作

进程与进程概念fork二级目录三级目录fork如何理解fork程序员角度:fork之后,父子共享用户代码(代码是可读的,不可修改或者写入),而用户数据各自私有一份(不让进程互相干扰)。操作系统中,所有进程,进程具有独立性的(操作系统所表现出来的)。内核角度:fork之后,创建子进程,通常以父进程为模板其中子进程默认使用的是父进程的代码和数据(除一些pid、ppid等)(数据用写时拷贝来写)进程=自己的程序代码+内核数据结构(task_struct)二级目录三级目录...

2023-06-02 17:02:13 842 26

原创 C语言—通讯录(可保存通讯录信息)

在写完通讯录的程序时,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。既然是通讯录就应该把信息记录下来,只有当选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,一般数据持久化的方法有把数据存放在磁盘文件、存放到数据库等方式。使用文件可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

2023-06-01 18:58:49 864 7

原创 C语言—动态内存管理

malloc函数的介绍:malloc函数用于开辟(申请)内存块(动态内存开辟)这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

2023-05-27 11:26:52 922 14

原创 C语言—通讯录(动态内存开辟)

字符串函数及字符函数字符串函数求字符串长度strlenstrlen函数的模拟实现长度不受限制的字符串函数strcpystrcpy函数的模拟实现strcatstrcat函数的模拟实现strcmp字符串函数求字符串长度strlen字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。参数指向的字符串必须要以 ‘\0’ 结束。注意函数的返回值为size_t,是无符号的( 易错 )strlen函数的模拟实现#prag

2023-05-25 14:03:30 599 13

原创 C语言—通讯录

但是当要操作通讯录中联系人的信息内容时,比如增加联系人信息,这时就需要知道通讯录中的联系人是否已经到达上限或者需要知道在哪个位置添加人的信息(需要知道当前通讯录中有几个人的信息),如果达到上限就无法再添加联系人。添加联系人时需要注意如果通讯录满了就不能再添加了,如果通讯录没满需要注意通讯录添加联系人信息的位置正好是已知记录当前通讯录中有效信息的个数所在联系人信息数组的下标的位置。在通讯录查找特定联系人信息,如果找到将查找函数返回的通讯录中联系人信息所在下标并打印通讯录中特定联系人信息的内容。

2023-05-21 13:40:31 1477 18

原创 C语言—自定义类型(结构体、枚举、联合)

int x;int y;} p1;//声明类型的同时定义变量p1 struct Point p2;//定义结构体变量p2 //初始化:定义变量的同时赋初值。x , y };struct Stu //类型声明 {//名字 int age;//年龄 };//初始化 struct Node {int data;} n1 = {10 , {//结构体嵌套初始化 struct Node n2 = {20 , {//结构体嵌套初始化struct S {char c;

2023-05-20 17:22:28 605 5

原创 C语言—字符函数和字符串函数

注:C语言标准规定strcmp库函数实现时满足如果第一个字符串大于第二个字符串返回大于零的数,如果第一个字符串小于第二个字符串返回小于零的数,如果第一个字符串等于第二个字符串返回等于零的数即可。这只是在VS编译器中strcmp返回值是这样的而在其他编译器下strcmp的返回值就不一定是1,-1,0,但是在所有编译器下strcmp函数的返回值一定是大于零、小于零、等于零(因为这是C语言标准规定的)这样的字节拷贝方法(在.c源文件下可以编过,但在.cpp源文件下不可以编过(这种方法是有问题的))。

2023-05-12 18:09:19 636 19

原创 C语言—指针的进阶

整形指针: int * pint;能够指向整形数据的指针。浮点型指针: float * pf;能够指向浮点型数据的指针。数组指针能够指向数组的指针int a = 10;//整型指针 - 是指向整形的指针 char ch = 'w';//字符指着 - 是指向字符的指针 //数组指针是一种指针 - 是指向数组的指针 double * d [ 5 ];//pd就是一个数组指针 int arr [ 10 ] = {

2023-05-01 08:40:48 1102 23

原创 C语言—深度剖析数据在内存中的存储

char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点型 double //双精度浮点型1.使用这个类型开辟内存空间的大小(大小决定了使用的范围)2.如何看待内存空间的视角实例一:不管是整数里面的正整数还是负整数,发现在当前编译器底下,这些补码都是倒着存储的大小端定义:大端(存储)模式(大端字节序),是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。

2023-04-22 11:47:14 951 32

原创 C语言—实用调试技巧

switch case语句中:case本身是用来判定的、break用来进行分支功能 任何具有判定功能的语法结构,都必须具备:判定+分支[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cArUKBwZ-1628348684153)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\1627726635270.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvHVBM..

2023-04-14 16:29:08 1463 28

原创 C语言—结构体

深度剖析数据在内存中的存储(二)本章重点浮点型在内存中的存储解析本章重点浮点型在内存中的存储解析

2023-04-07 13:44:03 636 29

原创 C语言—指针

指针本节重点1. 指针是什么2. 指针和指针类型3. 野指针4. 指针运算5. 指针和数组6. 二级指针7. 指针数组指针是什么指针和指针类型前言指针类型的意义三级目录本节重点1. 指针是什么2. 指针和指针类型3. 野指针4. 指针运算5. 指针和数组6. 二级指针7. 指针数组指针是什么在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思

2023-04-06 15:45:27 510 14

原创 C语言—操作符和表达式

分类:算术操作符的使用:注:直接写出的小数,编译器会默认认为是double类型的数注:%和/是不支持被零除或被零求模的总结:左移操作符 移位规则:左边抛弃、右边补0注:左移操作符左边抛弃、右边补0(包括符号位,移动到符号位是什么就是什么)右移操作符 移位规则:首先右移运算分两种:可以看出在VS编译器下采用的是算术右移注意:例如:补充:按位与操作符的使用:按位或操作符的使用:按位异或操作符的使用:注:不能创建临时变量(第三个变量),实现两个数的交换。版本一是有缺陷的,当两个数值过大时两数

2023-04-05 16:39:40 924 15

原创 C语言—数组

补充:数组作为函数传参的时候,形参可以写成两种形式:数组形式、指针形式。数组传参(不论是一维数组还是二维数组)在参数部分、调用部分传参的时候,实参传的时候一定是数组名(数组传参),而传过去形参部分展示的时候可以写数组也可以写成指针,但本质上都是指针(因为数组传参的时候传过去的其实是数组首元素的地址)。

2023-04-02 10:36:06 1179 22

原创 C语言—函数

自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是程序员来设计。这给程序员一个很大的发挥空间。statement;//语句项 } ret_type 返回类型fun_name 函数名para1 函数参数 {statement;//语句项} 函数体自定义函数的创建及使用://函数定义 int get_max(int x , int y) //x,y为形参 {int z = 0;else z = y;return z;

2023-03-30 19:34:01 739 15

原创 C语言—初识C语言

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

2023-03-18 18:26:03 987 45

原创 Linux-进程间通信

数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

2022-08-23 20:17:20 6389 102

原创 C++的类型转换

每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,向上转型子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)因此C++提出了自己的类型转化风格,注意因为。...

2022-07-28 17:19:33 599 42

原创 C++-智能指针

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:智能指针的原理std::auto_ptrauto_ptr的实现原理:注:unique_ptr的实现原理注意:C++98 – 2011年中

2022-07-27 17:36:37 434 42

原创 C++-异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常(对象类型太多,无法捕获),那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了(异常的抛出和匹配原则5)//服务器开发中通常使用的异常继承体系classException{public};public";";};public";}};cin>>i;...

2022-07-24 20:26:53 295 38

原创 C++11新特性详解

相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率。在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。thread在线文档说明stdreturn0。...

2022-07-23 20:11:24 8606 31

原创 C++的IO流

使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据(其单位可以是bit,byte,packet)的抽象描述。C语言中用到的最频繁的输入输出方式就是scanf()与printf()。...

2022-07-21 20:05:42 1276 36

原创 特殊类设计

总结C++98这种方式不够直接,这里是可以继承的,但是Derive不能创建对象,因为Derive的构造函数,必须要调用父类NonInherit构造,但是NonInherit的构造函数私有了,私有在子类不可见,那么这里继承不会报错,继承的子类创建对象会报错。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。C++11的不能被继承的方式,直观、简单明了。...

2022-07-14 20:43:30 588 29

原创 【手撕STL】bitset(位图)、布隆过滤器

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。这两个方案存在一个致命的缺陷——40亿个数据量太大内存存不下补充:1G=1024MB1MB=1024KB1KB=1024byte1byte=8bit1G大约是10亿个字节位图的应用快速查找某个数据是否在一个集合中排序求两个集合的交集、并集等操作系统中磁盘块标记给定100亿个整数,设计算法找到只出现一次的整数?这道题跟上面的题类似,利用位图解决:找出只出现一次的整数(无非有三种情况

2022-07-13 16:41:40 654 29

原创 【手撕STL】unordered_set、unordered_map(用哈希表封装)

unordered_map在线文档说明注意:unordered_set在线文档说明注:在功能上和map、set是一样的区别在于,这两个容器遍历出来不是有序的,他们是单向迭代器运行结果:注:unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构。总结:注: 当存储的数据没有特定说明需要排序时,一定要用unordered系列的关联式容器;当需要存储的序列为有序时,应该选用ordered系列的关联式容器对于两个数据元素的关键字 ki和kj (i != j),有ki !=kj ,但有:

2022-07-11 21:12:28 1393 38

原创 【手撕STL】map和set

这里写目录标题setset的使用举例map三级目录setset文档介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭

2022-07-09 22:06:24 564 29

原创 【手撕STL】红黑树

红黑树一级目录二级目录三级目录红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的注:AVL树:左右高度差不超过1,严格平衡红黑树:最长路径不超过最短路径的2倍,近似平衡红黑树的性质:每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的 (树里面没有连续的红节点)对于每个结点,从该结点

2022-07-07 22:46:54 720 52

原创 【手撕STL】AVL树

AVL树AVL树的概念AVL树的旋转三级目录AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,找到了解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。AVL树的性质:它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)如果一棵二叉搜索树是高

2022-07-05 20:02:25 627 33

原创 leetcode 239. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 3

2022-03-27 12:20:04 344 62

原创 leetcode 42. 接雨水(双指针、动态规划、单调栈)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9提示:n == height.length1 <= n <= 2

2022-03-27 11:30:35 2446 22

空空如也

空空如也

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

TA关注的人

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