自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux进程间通信【二】

管道通信本质是基于文件的,也就是说操作系统并没有为此做过多的设计工作,而system V IPC是操作系统特地设计的一种通信方式。但是不管怎么样,它们的本质都是一样的,都是在想尽办法让不同的进程看到同一份由操作系统提供的资源。system V共享内存和system V消息队列就类似于手机,用于沟通信息;system V信号量就类似于下棋比赛时用的棋钟,用于保证两个棋手之间的同步与互斥。

2024-04-10 17:13:42 734

原创 动态规划9,最长定差子序列,最长斐波那契子序列长度,最长等差数列

如果还没有做过前面的题,建议先去尝试。

2024-04-10 17:03:29 342

原创 Linux进程间通信【一】

管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”who | wc -l 查看当前服务器上的登录用户个数,其中,who 和 wc -l 是两个程序,运行起来后变成了两个进程,who进程通过标准输入将数据打入“管道”,wc进程再从“管道”中读取数据,完成了数据的传输。

2024-03-23 20:51:52 1022

原创 动态规划8, 摆动序列,最长递增子序列,最长数对链

f[i] 表示:以i 位置为结尾的所有子序列中,最后呈现 “ 上升” 状态下的最长摆动序列长度。g[i] 表示:以i 位置为结尾的所有子序列中,最后呈现 “ 下降” 状态下的最长摆动序列长度。状态转移方程。

2024-03-16 14:13:46 613

原创 动态规划7,等差数列划分,湍流子数组,唯一的子字符串,最长递增子序列

f[i] 表示:以i 位置为结尾的所有子数组中,最后呈现 “ 上升” 状态下的最长湍流数组的长度。g[i] 表示:以i 位置为结尾的所有子数组中,最后呈现 “ 下降” 状态下的最长湍流数组的长度。2.状态转移方程。

2024-03-13 13:52:29 941

原创 Linux 动态库和静态库 【详解】

动静态库的本质是可执行程序的“半成品”。就像这样,test1.c、test2.c、test3.c、以及main.c形成可执行文件,我们需要先得到各个文件的目标文件test1.o、test2.o、test3.o以及main.o,然后再将这写目标文件链接起来,最终形成一个可执行程序。

2024-03-10 14:39:39 790

原创 动态规划6,最大数组和,环形子数组最大和,乘积最大子数组

1.经验+题目要求dp[i]表示:以 i 位置为结尾的所有子数组中的最大和2.状态转移方程按长度来划分,如果长度为1,那么dp[i] = nums[i];如果长度大于1,那么当前位置的最大和就为 i-1 位置最大和 + 当前位置,dp[i] = dp[i-1] + nums[i];然后每一次都要取他们两个中的最大值。存在 dp[i-1] , 建表时候多建一格,dp[0]位置为0 就不影响后面的填表4 .从左往右填表。

2024-03-09 14:41:55 823

原创 Linux基础IO【 详 解 】

磁盘通常被称为块设备,一般以扇区为单位,一个扇区的大小通常为512字节。我们若以大小为512G的磁盘为例,该磁盘就可被分为十亿多个扇区。计算机为了更好的管理磁盘,于是对磁盘进行了分区。磁盘分区就是使用分区编辑器在磁盘上划分几个逻辑部分,盘片一旦划分成数个分区,不同的目录与文件就可以存储进不同的分区,分区越多,就可以将文件的性质区分得越细,按照更为细分的性质,存储在不同的地方以管理文件,例如在Windows下磁盘一般被分为C盘和D盘两个区域。命令:ls /dev/vda* -l 查看磁盘分区信息。

2024-03-08 12:28:03 645

原创 动态规划5,粉刷房子,买卖股票的最佳时期

1.经验+题目要求dp[i][0] 表示:粉刷到 i 位置的时候,最后一个位置粉刷上红色,此时的最小花费。dp[i][1] 表示:粉刷到 i 位置的时候,最后一个位置粉刷上蓝色,此时的最小花费。dp[i][2] 表示:粉刷到 i 位置的时候,最后一个位置粉刷上绿色,此时的最小花费。2.状态转移方程因为相邻两个房子颜色不能相同,所以我们粉刷下一个位置只需要 找出上一个位置粉刷另外两种颜色最小花费即可。

2024-03-03 22:20:23 832

原创 Linux 模拟实现shell【简单实现】

我们知道shell是一个永不退出的程序,所以他应该是一个死循环,并且shell为了防止影响到自己,我们在命令行上输入的所有命令都是由shell的子进程来执行的,所以它应该要有创建子进程的相关函数,当然也会有进程替换的相关函数,因为我们直接创建子进程,父子进程是共享代码的,如果没有进程替换,shell根本无法让子进程执行特定的命令。

2024-02-29 20:06:05 597

原创 动态规划4,打家劫舍问题,删除并获得点数

继续细化:f[i]表示:选择到i位置时候,nums[i]必选,此时的最高金额。g[i]表示:选择到i位置时候,nums[i]不选,此时的最高金额。如果 i 位置偷,那么i-1就不能偷,此时就是f[i] = g[i-1] + nums[i];如果 i 位置不偷,那么i-1就有两种情况,可以偷也可以不偷, 偷的话就是g[i] = f[i-1];不偷的话就是 g[i] = g[i-1];选出他们的最大值,就有了g[i] = max(f[i-1],g[i-1]);

2024-02-27 19:34:31 654

原创 动态规划3,地下城游戏

对于a思路来讲,我们需要上一步的两个位置的状态来更新下一个状态,就拿示例1来举例:我们要想从-2走出去,就需要3血量,但是无论走到下一步-3还是-5都会死,所以我们还会受到下两步的影响,所以这个思路不行。但是,又不能让血量为0或负数,所以每个dp[i][j]都需要取max(1,dp[i][j]), 如果为负数就更新为1。然后从1走向-5,我们要让所需的最小血量变为也就是6-1,为5,然后从-3走向3,变为2-(-3)为2,为5;然后从-2走向-3,变为5-(-2)即为7.然后从3走向1,变为5-3,为2,

2024-02-24 15:57:54 550

原创 动态规划入门2,最小路径问题,珠宝的最高价值

2.3.注意,对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1。4.从上到下填写每一行,每一行从左向右。int。

2024-02-24 15:05:28 363

原创 【算法】动态规划1,最小花费爬楼梯,解码方法

动态规划 , 英文名称 Dynamic Programming , 简称 DP , 不是具体的某种算法 , 是一种算法思想;

2024-02-20 19:30:33 211

原创 Linux进程控制【详解】

在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。fork之后,父子进程代码共享:我们可以看到,Before只输出了一次,而After输出了两次。Before是由父进程打印的,而在之后调用的fork,After由子进程和父进程两个进程执行。fork之后,父进程和子进程谁先执行完全由调度器决定。

2024-02-18 00:33:08 907

原创 Linux进程概念【详解】

优先级实际上就是获取某种资源的先后顺序,而进程优先级实际上就是进程获取CPU资源分配的先后顺序,

2024-01-31 21:00:24 1032

原创 操作系统(Operator System) 【详解】

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。简单来说,操作系统就是一款进行软硬件资源管理的软件。操作系统包括:1.内核(进程管理,内存管理,文件管理,驱动管理)2.其他程序(例如函数库,shell程序等等)对于计算机底层的硬件,肯定有一个软件来对这些硬件进行管理;eg:内存什么时候读取数据?什么时候刷新缓存区…这些都由软件来管理,而这个软件就是操作系统。但是操作系统肯定不能直接和底层硬件交互,eg:如果操作系统自己来完成键盘的读取操作,你的键盘读取方式改变了,操作系统那边就需要重

2024-01-22 13:43:43 357

原创 冯诺依曼体系结构【详解】

冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。截至目前,我们所认识的计算机,都是有一个个的硬件组件组成:1.输入单元:包括键盘, 鼠标,扫描仪, 写板等2.中央处理器(CPU):含有运算器和控制器等3.输出单元:显示器,打印机等1.2.3.4.

2024-01-19 14:40:06 1181 1

原创 linux第一个小程序 --- 进度条【简洁】

结果:先输入hello world然后休眠三秒后结束当去掉’'\n“ 后,结果就变成了先休眠三秒,然后打印hello world后结束。该现象就证明了缓冲区的存在。当缓冲区中遇到’‘\n’'或者缓冲区被写满后才会被打印出来,在第二张图片里面,没有\n,所以hello world先被写入缓存区,然后休眠三秒后,直到程序运行结束才将hello world打印到显示器。

2024-01-18 12:49:48 1946

原创 Linux基础工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【详解】

1.在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。2.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。3.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系。

2024-01-13 00:55:54 1500

原创 C++11【右值引用,移动语义,完美转发】

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。左值是一个表示数据的表达式(如变量名或解引用的指针)。我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。 左值引用就是给左值的引用,给左值取别名。左值引用就是对左值的引用,给左值取别名,通过“&”来声明。右值也是一个表示数据的表达

2023-12-20 17:46:09 829

原创 C++11 【初识】

1.在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。2.不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。3.从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2023-12-12 17:23:49 1126

原创 Linux中的权限问题【详解】

Windows和Linux的交互方式虽然不同,但其本质上却是一样,图形化界面和命令行界面都是为了让用户进行相关操作,而图形化界面和命令行界面就是我们所说的 " 外壳程序 "。Linux严格意义上来说是一个操作系统,我们称之为 "核心 (kernel) ",但我们一般用户不能直接使用kernel,而是通过kernel的 “外壳程序”,也就是所谓的Shell,来与 kernel 沟通。对目录来说,具有浏览该目录信息的权限。虽然目录被加上了粘滞位,但如果用户有该目录的可写权限,则不影响其在该目录下创建文件。

2023-12-10 16:50:38 1081

原创 AVL树【图解】

/三叉链//存储的键值对int _bf;//balance factor平衡因子AVLTreeNode(const pair& kv)构造函数,_kv(kv),_bf(0)

2023-12-07 18:04:57 884 1

原创 linux常见命令 【详解】

上面说到 -f 是强制性删除,-r是递归式删除,这两个结合在一起rm -rf dirname就是递归式强制性删除,千万不要执行以下指令,因为在Linux当中没有类似回收站的东西也没有撤销删除的功能,删除指令一旦执行则是不可逆的。: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。2)-a 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。

2023-12-03 16:06:56 862 2

原创 set,map,multiset,multimap【详解】

set是按一定的次序存储元素的容器在set中,元素的value是唯一的,不可以重复,且为升序排序(和字典一样)set的底层是二叉搜索树,set中的元素不可以修改set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。5.对于map来讲,里面存储的是真正的,但是set底层实际上存储的是,所以在插入元素时,只需要插入value就可以,不需要搞键值对。

2023-11-14 21:14:58 43

原创 二叉搜索树,二叉排序树(Binary Search Tree)【详解】

在我们当前函数root = new Node(key)创建新的结点,因为用了引用,这里的root就是上一个函数栈帧里面的root->_right;3.删除的左右子树都不为空(找出左子树的最大结点or右子树的最小结点来替换删除的结点就可以)1和2. 删除的节点如果是根节点,父节点为nullptr,要特殊处理,要不然会报错!它的特别之处在于中序遍历:1,3,4,6,7,8,10,13,14.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。2.非空找插入位置,大的右边找,小的左边找。

2023-11-11 23:02:32 76 1

原创 c++ 多态详解

1>多态的构成条件:1.必须通过基类的指针或者引用去调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写\虚函数虚函数:即被virtual修饰的类成员函数称为虚函数public:virtual void BuyTicket() { cout

2023-11-01 21:04:05 49 1

原创 C++继承 详解

继承的本质:类设计层次的复用public:protected:// 姓名// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了protected:int _stuid;// 学号protected:int _jobid;// 工号int main()Student s;Teacher t;s.Print();t.Print();return 0;

2023-10-31 13:09:36 39

原创 Vector和List的反向迭代器 详解

反向迭代器是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。在使用上,它的使用完全与普通迭代器相同。while (rit!++rit;

2023-10-29 16:33:29 171 2

原创 C++ list的模拟实现【详解】

1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代2.list底层是双向链表结构3.与其他的容器相比(array,vector,list),list通常在任意位置进行插入,移除元素的执行效率更好4.缺陷是不支持任意位置的随机访问head是哨兵结点,本身不存储数据,就是当头尾的作用。

2023-10-15 23:37:17 58

原创 C++ vector的模拟实现

3>给n个val初始化,用const T& val = T() 是因为你并不知道给的val是什么,int?现代写法,这里要实现深拷贝, v2 = v1其实是v1去拷贝构造v,然后交换v2和v,便可对v2赋值。对于insert和erase导致的迭代器失效问题,在这一篇中你可以看到更详细的分析。因为写了reserve函数来调整空间了,所以判断空间是否用完后直接尾插就好了。解决erase导致的迭代器失效,返回一个指向下一个位置的迭代器,然后及时更新。3.大于的话交给reserve调整空间大小,遍历给赋值。

2023-10-10 22:19:15 65 1

原创 有关vector模拟实现中迭代器失效问题

1 当容器调用erase时,当前位置到容器末尾元素的所有的迭代器全部失效2 当容器调用insert时,当前位置到容器末尾元素的所有的迭代器全部失效;3 当容器调用insert时,如果引起容器内存扩容,原来容器的所有的迭代器就全部失效进行更新操作:erase(insert)后会返回指向下一个元素的迭代器。

2023-10-08 13:30:19 65 1

原创 string模拟实现【详解】

在学习string模拟之前,我们需要知道string是表示字符串的字符串类。要认识一个类,就需要去先认识他的成员变量。//字符串指针//容量//字符串大小。

2023-09-24 17:54:13 57 1

原创 详解const在位置上的差异-(包含类与对象)

Print里面是const类型的形参,我们不希望s._a被改变,所以在函数前面也加了const,而operator【】函数有两个是因为一个是只读函数,而另有一个要可以修改,一个函数无法同时支持const和非const,所以写了函数重载。对于const在最前面我们可以想象没有int* p,那么const是不是修饰&a,那么&a是不是就没法修改,也就是a无法修改了,但是p不受影响,p是什么,p是指针,所以p的指向还是可以改变的。的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

2023-09-15 23:14:14 53

原创 构造函数初始化列表【详解】

尽量使用初始化列表初始化,因为不管你是否使用初始化列表, 对于自定义类型成员变量,一定会优先使用初始化列表初始化。初始化的步骤可以尽可能的放在一起,而构造函数体内就可以写其它的需求实现,增加代码的可读性。

2023-09-07 14:16:39 72 1

原创 拷贝构造函数【详解】

只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

2023-08-13 15:28:00 77 1

原创 构造函数与析构函数详解

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任 务并不是开空间创建对象,而是初始化对象。析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。

2023-08-13 00:03:34 661 1

原创 补:【数据结构】 二叉树 --- 详解

kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki = K2i+2) i = 0,1,2…对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。4.若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=Log2(n+1). (ps:Log2(n+1)是log以2为。

2023-08-06 23:16:37 45

原创 c++入门基础大全

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。注:一个命名空间就定义了一个新的作用域,命名空间的所有内容都局限于该命名空间中。//命名空间中可以是变量/函数/类型 int rand = 10;int val;//命名空间可以嵌套 namespace xxx {} } //同一个工程允许存在多个相同名称的命名空间,编译器最终会合并到一个 namespace nzq {

2023-08-04 15:04:06 69 1

空空如也

空空如也

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

TA关注的人

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