自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【操作系统】进程终止中exit()和_exit()的区别

语句,该语句添加了'\n',程序会先把 you can see me语句显示到显示屏上,再sleep3秒,再退出程序。语句,该语句没有加'\n',程序会先sleep3秒,直接退出程序,不会把 you can see me语句显示到显示屏上。语句,该语句添加了'\n',程序会把you can see me 语句显示到显示屏上,再sleep3秒,再退出程序。语句,该语句没有加'\n',程序会先sleep3秒,再把you can see me 语句显示到显示屏上,再退出程序。

2024-03-21 10:53:28 485

原创 【操作系统】进程地址空间

地址空间本质上是OS为进程虚拟抽象出来的一种看待内存和外设的一种方案,让进程PCB指向自己的地址空间数据结构,结合页表来完成到物理内存的映射。虚拟地址是Linux配合硬件,软硬件结合的方案,创造出的地址空间的概念,以统一的视角来看到不同的设备,地址空间是进程地址空间,地址空间是一种内核数据结构struct mm_struct{},它里面有各个区域的划分,它来描述进程所看到的各个区域,进程里面会有结构体指针指向mm_struct{}//...//其它属性。

2024-03-21 10:53:08 1115

原创 【C++】多态

有继承关系,子类重新父类中的虚函数在虚函数的后面写上=0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。四、多态的原理3.1、接口继承和实现继承1、普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现。

2024-03-16 23:33:18 1013

原创 【牛客】HJ62 查找输入整数二进制中1的个数

是计算一个数二进制表示中1的个数,通过(n >> i) & 1可以获取第i位的二进制值,每次n右移一位,可 以获取一位的二进制值,右移32次,n变成0,循环终止。可以举一个八位的二进制例子来进行分析,对于二进制操作,我们直到,除以一个2,原来的数字会减少一个0.如果除的过程有余数,那么就表示当前位置有一个1.因此,可以考虑利用整形数据除法的特点,通过相除和判断余数的值来进行分析。利用val=val&(val-1)巧妙解法能最少次数统计1的个数。第二此除以2时,商为101 000 余数为1。

2024-03-13 21:52:41 392

原创 【C++】继承

继承机制是面向对象程序设计可以复用代码的重要手段,它允许程序在保持原有类特性的基础上进行扩展,增加功能,产生新的类,这个类为派生类。继承体现的是类定义层次的复用 继承的意义是复用1、公有继承:继承基类的public、protected、private在派生类中保持基类的原有访问权限2、保护继承:继承基类的public、protected成员,在派生类中全为protected3、私有继承:基类private成员在派生类中都是不可见的,即使是派生类的类内和类外。

2024-03-13 20:51:53 985

原创 【牛客】HJ73 计算日期到天数转换

用一个数组存放每月的天数 输入的日期天数= 当月的天数 + 当月之前的累积天数 如果包含二月,再去判断是否为闰年,如果是闰年,再加1天。

2024-03-12 17:37:25 331

原创 【牛客】HJ74 参数解析

通过以空格和双引号为间隔,统计参数个数。对于双引号,通过添加flag,保证双引号中的空格被输出。

2024-03-12 17:36:30 305

原创 【牛客】HJ86 求最大连续bit数 CM24 最近公共祖先

上述树中子节点与父节点之间的关系为root = child / 2 所以如果a!= b,两个数进行比较,就让其中的较大数除以2, 如此循环直到a == b 即是原来两个数的最近公共祖先 比如: 2 和7的最近公共祖先:7/2 = 3 ---> 3/2 = 1, 2/2 = 1, 得到1为它们的公共祖先。根据位运算,获取每一位的二进制值。获取第i位的值: (n >> i) & 1。如果1连续,则计数累加,如果不连 续,则从0开始计数。用于统计当前最大连续1的个数。用于统计连续1的个数。

2024-03-10 15:54:15 260

原创 【牛客】CM26 二进制插入 HJ60 查找组成一个偶数最接近的两个素数

取出m的每一个二进制位 (m>>k)&1 假设k=0,即第一位二进制位(1101&0001)=0001。左移j+k位,取到逐个赋值到对应n的对应位数,或操作就是任意一个为1,则当前位为1。1、素数:判断素数,素数表示除过1和本身,不能被其它数整除。3、先从偶数的中间位置开始从两边查找素数对,m左移j位,然后进行与n或运算(|)即可。2、找到组成一个偶数的两个素数。8 12 8和12不是素数。7 13 7和13都是素数。9 11 9不是素数。

2024-03-10 15:53:26 419

原创 LCR 175. 计算二叉树的深度

4、最后返回左右子树较大的二叉树深度+1即为根节点二叉树深度。3、转换子问题:成求右子树为根节点的二叉树深度。2、转换子问题:求左子树为根节点的二叉树深度。1、要求根节点的二叉树深度。递归求左右子树的高度。

2024-03-08 21:19:48 350

原创 【牛客】HJ87 密码强度等级 CM62 井字棋

本题主要考察C语言中逻辑分支语句,基本语句以及对各种特殊字符 ,ASCII值以及条件表达中的逻辑运算符关系运算符各自功能的理解,以及基本使用,根据不同的条件,进入不同的分支,统计求和。1、先统计大小写字母,数字,以及特殊字符的个数。副斜board[row][col-1-i]正斜 board[row][row]2、再对题目给的限定条件累加求和。整个一行相加结果为列数 就获胜了。整个一列相加结果为行数 就获胜了。

2024-03-08 21:18:56 185

原创 【网络】HTTPS协议原理

数据摘要(数据指纹)基本原理是利用单向散列函数(Hash函数)进行信息运算,生成一串固定长度的数字摘要。数据摘要(数据指纹)并不是一种加密机制,可以判断数据是否被篡改。因为加密机制是可以对密文信息进行解密和加密,所以不是一种加密机制。HTTPS工作过程涉及到三组密钥第一组:CA机构的公钥和私钥保证客户端拿到服务器的公钥第二组:服务器持有的公钥和私钥用于协商对称密钥的私钥,客户端拿到服务端的合法公钥,就会随机生成对称密钥并且加密,发送给服务端,服务端通过私钥进行解密获取到对称密钥第三组:客户端生成的对称密钥。

2024-02-23 19:36:23 1098

原创 【C语言】程序编译链接详解

通过加选项-s来查看test.o,add.o形成的符号表。

2024-02-23 19:35:43 1690

原创 【高并发内存池】定长内存池实现

目前先介绍外碎片,所谓外碎片问题,是指一些空间的连续内存区域太小,这些内存空间不连续,以至于即使有足够的内存空间,也无法满足一些内存分配申请的需求(一段连续空间被切出去好多快,但是只有部分还回来了,但是它们不连续,导致要申请超过某个空间申请不出来,即使总空间大于要申请的空间,也申请不下来)。以服务器上的线程为例,它的主要思想是:启动诺干数量的线程,让他们处于睡眠状态,当接收到客户端的请求时,唤醒池中某个睡眠的线程,让它来处理客户端的请求,当处理完这个请求,线程又进入睡眠状态。2.3、内存池主要解决的问题。

2024-01-18 21:51:50 1115 1

原创 【数据结构】堆的实现和排序

前面两种思路当数据量特别大时求解不太容易现实,100亿个整数要占用40G的内存(1G=1024MB=1024*1024kb=1024*1024*1024byte 1G占10亿字节左右),明显不合适。思路2:将这N个元素建成大堆, Top和Pop K次 时间复杂度 O(O(n)+k*logN);在堆尾插入数据后,在插入的位置开始向上调整,依然保持堆结构。思路1:堆排序 时间复杂度O(N*logN)向上建堆的时间复杂度是O(n*logN)建堆有两种方式:向上建堆和向下建堆。向下建堆的时间复杂度是O(n)

2024-01-18 21:51:38 375

原创 【Linux】进程控制-进程终止

退出码是计算机为了方便返回结果设定的,我们并不清楚返回的1、2、3、4是什么意思,所以需要做一个将对应错误码或退出码转化为字符串描述的方案 .非0标识的是运行结果不正确,非0值有无数个,不同的非0值可以标识不同的错误原因,方便在进程运行结束后,结果不正确时,方便定位错误的原因。返回给上一级进程,父进程或者bash,用来评判该进程执行结果用的。0是退出码的一种,代表运行成功,代码对或不对用退出码判定。如果想在命令行中获取最近一次进程退出的退出码 通过。2、关闭所有打开的流,所有的缓存数据均被写入。

2023-12-03 19:46:11 406

原创 【Linux】进程控制-进程创建

fork()创建子进程,本质是系统里多了一个进程,该进程有对应的PCB,对应的地址空间,对应的页表,并将自己进程对应的代码和数据加载到内存,构建映射关系,将该进程PCB放入到运行队列里,等待OS或调度器调度,一旦CPU调度该进程,此时可以通过虚拟地址空间和页表找到该进程的相关代码,然后从上往下执行顺序语句,循环判断,函数跳转,进而在进程内部执行进程内的代码,完成某件事情。理论上,子进程也要有自己的代码和数据,可是一般而言,我们没有加载的过程,也就是说,子进程没有自己的代码和数据。

2023-12-03 19:46:01 412

原创 【Linux】环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数问题引入:为什么系统命令可以直接运行,我自己写的程序必须带路径,如果不带路径,可以让自己写的程序程序和普通命令一样运行自己的程序吗?例如能够像指向系统命令pwd一样执行myproc程序因为OS运行一个命令要先找到它,不带路径就无法找到,OS的命令默认是可被找到的,这些命令在echo $PATH中(加$可以看到环境变量PATH里的内容),pwd命令在环境变量里的/usr/bin路径中,所以pwd可以被找到,而我们的程序并不在环境变量里的路径中。

2023-12-02 19:37:46 308

原创 【排序】直接插入排序和希尔排序

1>、元素集合越接近有序,直接插入排序的时间效率就越高,最坏情况是逆序<2>、时间复杂度:O(n^2)<3>、空间复杂度:O(1)<4>、稳定性:它是一种稳定的排序算法。

2023-12-02 19:37:26 167

原创 【C语言】整形在内存中的存储

大端存储模式,是指数据的高位保存在内存的低地址处,数据的低位保存在高地址处。小端存储模式,是指数据的低位保存在内存的低地址处,数据的高位保存在高地址处。

2023-11-23 16:20:27 66

原创 【C语言】结构体内存对齐

4、如果嵌套了结构体情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有的最大对齐数(包含嵌套结构体的对齐数)的整数倍。结构体的内存对齐是拿空间来换取时间的做法,如果在设计结构体的时候,既要满足对齐,又要节省空间,应该让占空间小的成员尽量集中在一起。3、结构体的总大小:最大对齐数(所有变量类型最大者和编译器默认对齐数取最小值)的整数倍。linux环境下没有默认对齐数(没有对齐数时,自身大小就是它的对齐数)2、其它成员变量要对其到某个数字(对齐数)的整数倍的地址处。

2023-11-09 20:24:13 67

原创 【Linux】Linux项目自动化构建工具Makefile

make是一个命令,makefile是一个文件,makefile文件里面包含依赖关系和依赖方法,一般必须有依赖关系和依赖方法,依赖关系可以不依赖任何文件,写makefile时要有目标,怎么生成项目,怎么清理项目,生成项目进行依赖关系和依赖方法的编写,清理项目使用.PHONY定义一个伪目标,使用伪目标来清理项目,伪目标总是被执行的,makefile辨别程序是否重新编译,取决于源文件和可执行程序时间的新旧,来决定程序是否重新编译。

2023-11-06 21:40:09 44

原创 【Linux】gcc/g++编译器原理

2、实际上系统把这些函数实现都放到名为libc.so.6的库文件中,在没有特别指定时,gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这样就实现函数“printf”了,体现出了链接的作用。1、我们的C程序中,并没有定义“printf”的函数实现,而且再预编译中包含的“stdio.h”中只有该函数的声明,而没有定义函数的实现,那么“printf”是在哪里实现的?动态库一般后缀名为".so","libc.so.6"就是动态库,gcc在编译时默认使用动态库。

2023-10-31 19:53:56 126

原创 【Linux】进程状态

运行:task_struct结构体在运行队列中排队(等待某种资源),就叫做运行态。(进程还没有被CPU调度,正在等待调度器调度)阻塞:等待非CPU资源就绪,进程所处的状态为阻塞状态系统中一定存在各自资源的,除了CPU,还有网卡,磁盘,显卡等其他设备,系统中不只是存在一种队列,磁盘也可能由多个进程要访问,所以多个进程要访问同一个资源要排队等待。

2023-08-01 10:03:04 293

原创 【Linux】进程

所以想优先执行一个进程,在众多描述进程属性PCB中找到优先级高的,它的属性里面就是指向进程代码和数据的属性,就可以把它的代码和数据加载到CPU中,如果想删除一个已经是死亡状态的进程,就可以遍历所有的进程属性,找到死亡状态,把它曾经开辟的代码和数据free掉和和该进程的PCB结构体变量也删除,对应了遍历操作和链表的删除操作。因为父进程可以有一到多个子进程,而一个子进程只能有一个父进程,父进程和子进程的对应关系是1:n,fork之后,给父进程返回子进程的pid,父进程能通过pid区别子进程。

2023-07-30 21:26:53 67

原创 【LeetCode21】合并两个有序链表

定义head和tail的指针,并指向空,两个有序链表从头结点位置开始比较值大小,较小的值尾插到新链表上。按照思路编写,可能会遇到空指针问题。

2023-07-25 21:35:43 51

原创 【LeetCode 剑指offer 22】链表中倒数第k个结点

具体过程:开始快慢指针都指向头结点,先让快指针走k步,然后快慢指针同时走,当快指针走到空的时候,慢指针的位置即为链表倒数第k个结点的位置。快指针先走k步,快慢指针同时走。

2023-07-24 19:35:57 60

原创 【Linux】冯诺依曼系统与操作系统

所以OS要管理硬件,OS内部管理各种不同的硬件就要有对应描述该结构体的数据结构,把所有的数据结构以链表结构维护起来,当有硬件状态发生变化时,只要改数据结构就行,所以对硬件的管理工作,就转化成了对数据结构的管理。4、因为存储器的存在,可以用一些软件上的策略,比如操作系统,可以预先把外设中的数据加载到内存当中,让cpu和内存交互,而不用与外设交互,能够一定程度上提高整机的效率问题。OS要先对被管理对象进行描述,根据描述类型,定义对象,可以把对象组织成特定的数据结构,因此对多个管理对象变成对某种数据结构的管理,

2023-07-24 16:05:08 106

原创 【LeetCode876】链表中间结点

876. 链表的中间结点 - 力扣(LeetCode)题目描述: 定义一个快指针和慢指针,快指针走一次走两步,慢指针一次走一步。结束条件:当链表长度为奇数,快指针的下一个位置为空结束 当链表长度为偶数,快指针的位置为空结束当快指针的下一个位置为空或者快指针的位置为空时,慢指针的位置即为中间结点。 代码实现:

2023-07-23 18:16:17 79

原创 【LeetCode189】轮转数组

将最后的数字用临时变量temp保存,前面n-1个数字往后移动,把temp的值放在数组的第一个位置。时间复杂度为O(n^2),空间复杂度为O(1)

2023-07-22 20:27:34 67 1

原创 【Leetcode206】反转链表

定义指针cur指向旧链表头结点,next保存下一个结点的地址。创建链表新的头结点指针,并且指向空,改变结点1下一个指针的指向,让其指向新的头结点更新新链表头结点指针,一直遍历迭代,当cur为空遍历结束。* };*/while(cur)//头插方法cur=next;

2023-07-22 19:50:58 99 1

原创 【Linux】vim编辑器

vim默认打开的是命令模式,可以控制屏幕光标的移动,行复制,行删除等等。

2023-07-08 10:10:15 177

原创 【Linux】yum软件包管理器

在介绍软件包和软件包管理器之前,引用生活中我们常常接触的例子如果我们在手机中安装一个App,直接在应用商店找到自己想要下载的App安装即可。从小白视角:只是单纯认为把应用商店的App下载到自己的手机中Linux程序员的视角:首先是需要提供软件的人将自己的产品发布到手机应用市场,用户再从手机应用市场获取到下载App的资源。所以在Linux操作系统中,也需要对应的应用市场,Linux社区或者对应的开发人员将自己的软件包放在服务器上,通过包管理器能够很好的获取编译好的软件包,直接安装即可。

2023-07-05 11:49:30 1039 1

原创 类和对象-上篇

初学必看

2023-06-07 17:32:01 174

原创 <初识>c++模板

返回值类型 函数名(参数列表){}示例:实现交换函数模板1、函数模板利用关键字template。2、函数模板有两种使用方式:自动类型推导和显示指定类型。3、模板的目的是为了提高代码的复用性,将类型参数化。4、使用模板必须确定出通用数据类型T,并且能够推导出一直的数据类型。类模板定义格式和函数模板定义格式类似,模板声明后紧跟着的是一个类1、类模板和函数模板语法类似,在声明模板template后面加类,称为类模板。2、类模板没有自动类型推导的使用方式。3、类模板在模板参数列表中可以有默认参数。

2023-05-23 16:46:08 108

原创 C++命名空间

定义命名空间,需要使用namespace关键字,后面跟上命名空间的名字,命名空间的成员可以有定义变量,定义函数,结构体类型等。​// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型//2. 命名空间可以嵌套int a;int b;int c;int d;//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。​。

2023-04-27 17:09:54 86

原创 <Linux>shell命令以及运行原理

你看上了小花,但是又不好意思直接表白,那就让你家人找媒婆帮你提亲,所有的事情你都是直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫她王婆,她对应我们常使用的bash。我们人不善于直接去银行进行存取业务,因为我们不知道银行内部是如何运转完成存取业务的,如果让我们代替银行工作人员来完成自己的存取业务,可能会导致一系列问题,因此我们不会直接访问操作系统的。shell对于Linux有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核,内核运行出结果后。

2023-03-30 22:21:09 100

原创 <数据结构>顺序表增删查改的实现

/在SeqList.h中#pragma once//防止头文件重复包含//指针指向动态开辟的数组int size;//有效数据个数//容量空间大小}SL;//初始化//销毁//打印//容量检查//尾插//头插//尾删//头删//任意位置插入//任意位置删除//查找//修改。

2023-03-30 15:33:24 531

原创 C++中引用变量详解

引用实际上是给一个变量起别名,编译器不会为引用变量开辟一个新的内存空间,变量和它的引用变量共用同一块内存空间。就好比水浒传中的李逵有的别名,既可以叫做黑旋风,也可以叫铁牛,实际上都是同一个人。语法:数据类型& 别名=原名int main(){//b是a的别名//两者打印的结果是一样的cout ......

2022-08-11 15:16:46 1933

原创 C语言实现-直接插入排序(带图详解)

1.元素集合越接近有序,直接插入排序算法的时间效率越高2.时间复杂度O(N^2)3.空间复杂度O(1),它是一种稳定的排序算法4.稳定性稳定https。

2022-07-28 20:28:59 3678 1

空空如也

空空如也

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

TA关注的人

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