自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【笔试训练】day24-day48合集

设原来字符串长度为n,所以我们只需要维护一个区间为n的子串,从中间分开,看分开的两个区间中1的数量是否相等。由于非0即1,1的数量确定,0的数量也就确定。值得注意的是,求树的高度时不能自顶向下,这样总的时间复杂度就是N^2.为了避免重复计算一些节点的高度,可以采用自底向上的方式。于是我们枚举长度为n子串的左端点,右端点也就确定了,在用前缀和O(1)的时间复杂度内求出这个区间左右两半1的数量。这题的要求又是一个谜。空间复杂度为1,这意味着都不能递归,因为递归开栈的空间复杂度就不止O(1)了。

2024-05-10 23:34:46 256 4

原创 【多态】初次遇见我就爱上了多态

表面上来看,虚函数就是被关键字virtual修饰的函数。而一旦被声明成了虚函数,将来通过父类指针或者引用就能区分出应该调用父类的函数还子类的函数。虚函数不能被static修饰,也通常不能同时是内联函数。要想区分两个函数是重写,重载还是重定义,首先观察其函数名是否一样。如果不一样,那就直接拜拜。再观察两个函数是否在不同的域中。如果在同一个域中且返回值类型不同,那就构成重载。如果一个在子类,一个在父类,那么再观察这俩函数是否是虚函数。

2024-04-23 21:52:59 1886 2

原创 【MySQL】索引的原理及其使用

16KB的页大小是一个经过多年实践验证的设置,MySQL和InnoDB开发团队已经对其进行了大量优化,确保其在各种应用场景下都能提供良好的性能和稳定性。下面来看一个page的内容:不同的page在mysql中都是16kb,其内部有prev和next两个指针构成双向链表。一个表文件可能需要诺干个page来存储数据,于是,对数据库中表的管理就变成了对page的管理了。值得注意的是,

2024-06-21 15:10:12 644

原创 【MySQL】表的内连和外连

左外连接返回左表的所有行,包括右表中与左表条件匹配地行。如果左表的某一些行在右表没有与之匹配的行不,则右表的列会显示null。内连接是SQL中常用的连接类型之一,用于将两个表中满足条件的行合并成一个结果集。含义和左外连接类似,只不过是以右表为主,如果左表没有与之条件匹配的行,合并后该行的左表信息显示NULL。笛卡尔积的大小:例如表A有n行,表B有m行,那表AB的笛卡尔积的结果集为n*m行。其中如果两个内连的表是同一张表,我们称之为自连接。在mysql中,笛卡尔积是指两个表没有指定任何连接条件的连接结果。

2024-06-13 20:33:33 839 1

原创 【MySQL】mysql中常见的内置函数(日期、字符串、数学函数)

md5()是一种常见的哈希函数,接收一个字符串然后返回一个128位的哈希值,通常32位的十六进制表示。注意:length函数返回字符串的长度是。(现代的密码加密已经不再用md5了)。,有点类似c语言中的三目运算符。查询在2小时内发布的贴子。password()函数。md5函数的常见用途是。

2024-06-13 17:19:45 456

原创 【MySQL】表的基本增删查改(结合案例)

在前面我们学习了针对库的操作以及针对表结构的操作,下面我们来学习针对表中数据的操作。对数据操作的类型无非就是,针对以上四种类型的操作,结合案例展开讨论。

2024-06-12 13:18:40 1340 1

原创 【C++11】常见的c++11新特性(一)

c++11,即2011年发布的新c++标准。相比于c++98和03,c++11带来了很多变化,其中包含了约140多个新特性,以及对c++03标准中大约600多个缺陷的修正。这使得c++11更像是一个从c++98/03孕育出来的一个新版本。对比于之前的版本,c++11能更好的用于系统开发和库开发、语法更加的泛华和简单化、更加稳定和安全,不仅功能更加强大,而且能提升程序员的开发效率。这也是我们学习c++11的重要原因。下面介绍常见的一些c++11特性。左值引用只能引用左值,不能引用右值,比如。

2024-06-10 17:00:26 1206 6

原创 【MySQL】表的约束

在MySQL中,给表设置约束能有效的保证数据的完整性和准确性,例如数据类型其实就是一种约束。但是光有数据类型作为约束是不够的,需要一些额外的约束来保证数据的合法性,下面就介绍一些常见的约束及其用法。

2024-06-08 16:09:54 940 2

原创 【MySQL】数据类型

enum表示枚举,set表示集合

2024-06-06 21:33:01 427 2

原创 【MySQL】表的操作

下面学习MySQL中对表的一些操作指令集。

2024-06-06 13:21:02 594

原创 【Linux多线程】线程的终止、等待和分离

需要注意,pthread_exit或者return返回的指针指向的内存单元应该是全局的,因为线程终止之后其函数栈帧会销毁,之后才会返回一个void*指针。并且,如果不对这些已经终止但是还没有被释放空间的线程做处理,往后继续创建新线程都不会复用前面退出线程的地址空间,这就造成了。观察上面代码运行情况,发现当线程return之后确实被终止了(上图多出来一个线程是库里面的管理线程,不必理会)。,比如线程一处理上半段数据,线程二处理下半段数据,如果其中任何一个线程没有终止,那总数据就会不完整。

2024-06-05 23:28:01 1059

原创 【Linux多线程】LWP和pthread_t

每当使用pthread_create创建一个线程时,在底层内核会生成一个LWP实体,就跟创建进程时会生成PCB实体一样,只不过LWP更轻量。除此之外,pthread_create还会在用户空间上生成pthread_t类型的标识符,前者用于用户操作(如等待线程结束、取消线程等),后者用于内核管理。LWP本质是一个描述线程的一个概念,因为linux中没有单独为线程设计一套管理方案,又为了与进程PCB区分开(LWP是Linux中线程的具体实现形式,在linux中,进程和线程本质上都是相同的,都是通过。

2024-06-05 15:53:15 811 16

原创 【MySQL】库的操作

字符集决定了数据怎么写入数据库,而校验规则决定了如何从数据库中读取数据。正确的设置互相匹配的字符集和校验规则可以使我们保证数据一致性,大多数的乱码问题都是因为字符集与校验规则的不匹配问题导致的。

2024-05-29 21:47:37 1406 1

原创 【Linux多线程】认识多线程&&创建线程

进程是正在运行的程序的实例,而线程(thread)是进程中的一个执行路线。一个进程可以拥有多个线程。从程序的角度上来说,线程是一个独立运行程序的片段。当程序运行时,进程把大部分资源合理分配给每个执行流(线程),且所有线程共享进程的地址空间,所以线程实际上就是一个轻量级的进程。下面给出进程中的线程示意图:值得注意的是,windos下的线程是有线程控制块(TCB)的。而linux下的进程控制块和线程控制块都是。

2024-05-29 16:11:26 1070

原创 【进程空间】通过页表寻址的过程

我们知道每个进程都有属于自己的虚拟地址空间,且每个进程的虚拟地址都是统一的。要想通过虚拟地址访问物理地址,我们就需要借助页表来建立映射关系。下面对于如何借助页表来寻址展开详细解释(以32位操作系统为例)。页框(Page Frame)是物理内存中的固定大小的块,通常为4KB。在物理内存中,页框是用于存储实际数据的最小单元。假设内存大小为4GB,也就能划分出1024*1024个页框。当进程通过页表来访问物理地址时,其本质就是找到页框的地址。于是,操作系统对内存的管理,就可以看成是对页框即块的管理。

2024-05-28 20:12:42 817

原创 【数据结构】哈希表的原理及其实现

哈希表类主要有两个模块需要实现,一个是节点类,还有一个是存储节点的容器。跟线性探测代码不一样的地方在于,拉链法的节点实际上是一个链表的头节点(桶)。值得注意的是,由于线性探测法的特性,删除一个元素之后可能会影响后续查找元素。造成哈希冲突的主要原因是,哈希表的大小是有限的,而输入的数据可能会非常多,因此不可能避免出现哈希冲突。于是,当我们发生哈希冲突时,不用去哈希表中找空位了,因为当前桶是一个单链表,插入元素时直接头插就好了。该文件封装实现了一个哈希表类,哈希函数是除留余数,解决哈希冲突的方法采用拉链法。

2024-05-26 16:02:15 939 1

原创 git常见的18条指令

使用git的时候有没有遗忘指令的情况呢?删除工作区的文件并将此删除操作放入暂存区。记住这些指令的秘诀:无他,为手熟尔。

2024-05-23 22:48:39 418 1

原创 【数据库基础】基本认识数据库--入门引导

数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或应用相关的信息。和文件系统存储管理数据的方式不同,数据库以结构化的方式进行存储,比如按行列式(类似于表格)等形式。数据更加安全更有利于数据的查询和管理有利于存储大量数据控制数据方便数据库存储的介质:磁盘和内存。

2024-05-23 21:56:18 983

原创 【进程信号】可重入函数&&volatile关键字

虽然执行了myhandler,也成功修改了flag的值,但是由于编译器优化,早就将flag的值拷贝到寄存器中了,CPU只会在寄存器中读取flag的值。标准情况下,键入 CTRL-C ,2号信号被捕捉,执行自定义动作,修改 flag=1 , while。意思就是说,可重入函数里面的数据都是临时变量,随着函数栈帧的销毁而销毁,编译器在优化代码的时候,会大概推断出哪些变量在特定的范围内不会改变。保持内存的可见性,告知编译器,被该关键字修饰的变量,,对该变量的任何操作,都必须在真实的内存中进行操作。

2024-05-22 16:51:01 673 3

原创 【进程通信】信号的捕捉原理&&用户态与内核态的区别

在之前的学习中,我们已经知道了信号是如何产生的,也知道了进程是如何记录一个信号的。如果进程收到了一个信号且没有屏蔽这个信号,则会将信号编号作为handler数组的下标执行该信号的处理函数。我们将处理特定信号的事件的过程叫做信号的捕捉。下面将带大家了解从操作系统的角度看是如何捕捉信号的。用户态权限有限,户态权限最高。安全性:由于权限较低,用户态不能访问系统核心,较为安全。而内核态具有完全控制权,一旦出错可能导致整个系统崩溃。系统调用:用户态不能执行系统调用,需要切换到内核态。

2024-05-21 23:15:16 1554 23

原创 【多人协作】场景模拟(二)

接下来就是将dev1和dev2分支合并到master上。由于是两个不同的文件,合并的时候其实不会有冲突,因为dev1和dev2分支提交的内容是两个不同的文件。如果有开发需要多人协作完成,一般是不会在一个分支下去多人开发的。因为在同一分支下容易造成版本冲突,这样显得比较麻烦。所以我们可以根据需求来建立分支,例如每一个功能点创建一个分支。指令保证本地的master是最新的,并且拉取了远程的所有分支。这样一来,开发人员都提交了各种的文件到远程的分支中。只拉取远程的dev1分支到本地。开发人员b重复上述操作。

2024-05-20 15:49:51 875

原创 【分支管理】远程分支删除后在本地还能看到的解决办法

指令还能看到.这是因为远程删除分支的操作并没有同步到本地,这使得本地的一些仓库分支会显得非常凌乱。这样就删除在本地删除dev了,使用git branch -a指令也看不到了。当我们在远程仓库删除了一些分支,在本地仓库使用。根据提示删除远程厂库已经不存在的分支。提示内容就是括号里面的指令。查看被删除的远程分支。

2024-05-20 15:23:02 143

原创 【第二章】自定义信号和槽函数

除了使用Qt框架提供的信号外,我们还可以自己定义信号以及槽函数。自定义信号和槽函数使得程序设计更加灵活。与槽函数一样,使用信号跟使用普通函数类似,只不过需要使用关键字signals声明且函数的返回值类型必须是void。signals:值得注意的是,在类中自定义一个信号时==,实际上只是声明了一个函数原型==。信号本身并不需要“我们”自己来具体实现,而是由Qt依据元对象编程技术自动生成。所以我们只需要告诉Qt这个函数是一个信号就可以了。槽函数可以是任何的普通函数,只需要在声明的过程中使用slots关键字。

2024-05-20 12:39:19 404

原创 【第二章】信号与槽——connect函数的用法

connect函数是Qt框架中一个核心的函数,用于连接信号和槽。Qt提供了多个connect函数的重载版本,用来适应不同场景的需求。旧的字符串形式缺乏类型安全,不推荐适应使用。新的基于函数指针的形式和更加安全和简洁。推荐在Qt5及以后的版本中使用。此外,lambda表达式作为槽提供了更多的灵活性和简洁性。

2024-05-19 14:44:45 979

原创 【进程信号】信号阻塞的原理

每一个位都表示一种信号,如果有信号发送给该进程,那么这个位图对应的信号位就会置为1。观察上面图片,信号的未决表和阻塞表都是位图结构,且每一个比特位的位置都是表示信号的编号。其每一个比特位都表示一个信号编号,如果是1则表示该对应信号被阻塞,即使信号到达,进程也不会处理。功能:初始化一个空的信号集,即将信号集中所有信号清楚,也就是让信号集中的每一个比特位清0。对于信号的学习,我们将其分为三个部分:产生信号、接收信号、处理信号。,显然,对handler数组某一元素内容的修改,即修改某一信号的响应方式。

2024-05-16 19:59:47 757

原创 【数据结构】红黑树的原理及其实现

与AVL实现类似,红黑树的节点依旧有三个指针分别指向父节点、左孩子节点、右孩子节点。且有一个变量表示当前节点的颜色。初始默认是红色。为什么默认设置为红色呢?这是因为插入节点时,新节点一定与空叶子节点相邻。而根据红黑树的性质,空叶子节点的颜色是黑色,这就使得,如果新插入节点是黑色,那么每插入一次这条路径就一定会多出来一个黑色节点,即一定要调整。虽然新节点是红色也可能会需要调整,但影响会少很多。//键值对//颜色:_kv(kv),_col(RED)

2024-05-15 12:43:37 816 1

原创 【多人协作】场景模拟(一)

多人协作也就意味着同一时间里,可能有很多人提交不同版本的代码到远程仓库中,也就要求我们理解并且熟悉分支管理等操作。要求两名开发人员不能直接在master分支下操作,需要新建一个dev分支,并将代码先提交到dev分支下。这是因为由于a提交的代码和b提交的代码有冲突。而且由于a已经提交过代码了,此时b本地的dev分支已经落后于远程的dev分支了。多人协作的目的还是将开发后的代码合并到master上去,让我们的项目运行最新的代码。此时a和b就完成了各自的工作,并且成功将代码合并提交到了远程的dev分支中。

2024-05-13 21:10:04 961

原创 【进程通信】了解信号以及信号的产生

信号是进程通信的一种方式。如同我们按下ctrl+c就能终止一个进程,实际上就是bash进程向子进程发送了一个终止信号。和手机信号,wifi信号等类似,进程之间也可以通过信号来传递某种信息。不同的是,进程之间的信号本身就是一种共享资源。信号是如何产生的?被谁产生的?又是怎么获取信号的?本篇文章将从这几个问题展开叙述,详细讲解信号产生的原理。所有的信号本质上都是又操作系统产生的。只不过是进程委托操作系统将这个信号发送给另一个进程(也可以是自己)。告诉某个进程发生了什么。怎么做由开发者决定。

2024-05-12 20:01:00 1143 16

原创 【笔试训练】day23

再计算杀一只小怪要扣多少血就好了,再用总生命值去除这个扣血量,得到的就是最多杀死小怪的数量。每次将一条边上的两个点加入到一个集合里面,最后计算集合的·数量就好了。即如果字符串A和字符串B有一样种类的字符且每种字符数量都相等。给出一个技巧,直接将AB排序之后比较看是否一样就好了。思考这样一个结论:一个字符串如果可以任意交换相邻位置,代表这个字符串可以随意排列。由于是先手攻击,如果一次攻击就能杀死小怪,那么说明可以为无限杀小怪。所以我们只需要比较AB每一种字符的数量和种类是否相等就好了。

2024-05-10 17:14:04 266 1

原创 AVL树的原理及其实现

回顾我们对于二叉搜索树的了解,二叉搜索树的效率跟树的高度成反比。而且,数据插入的随机性导致普通的二叉搜索树甚至可能退化成一条“单链表”,这样的结构查找起来时间复杂度直奔O(N),这无疑是我们不想看到的。我们希望,无论数据怎么插入,二叉搜索树的结构都应该保持平衡,即看起来更加接近于完全二叉树或者满二叉树AVL树因此诞生。

2024-05-10 13:49:05 1178 15

原创 【第一章】初识Qt

Qt是一种跨平台的应用程序和用户界面框架,使用c++语言开发,由Qt Company(开发维护Qt的一个公司)支持和维护。Qt框架广泛应用于开发GUI应用程序,同时也可以开发非GUI程序,如命令行工具和服务器。Qt常用于电脑桌面应用开发,而电脑桌面应用开发又是前端开发中的一个分支。再说白一点,Qt就是用来搞前端的。那么作为众多前端开发技术中的一员,Qt又有哪些特点呢?

2024-05-09 23:04:23 1531 9

原创 git的标签管理

在Git中,标签tag用于标记特定的一个重要点,比如版本发布。标签允许捕捉某一次提交的状态,当我们需要退回到某次提叫的版本时,通过标签我们快速定位到。

2024-05-09 12:21:14 439 1

原创 【笔试训练】day22

在添加字符之前,A和B最多相等的位数是多少?由于A后面可以添加字符,也就使得A字符可以在B的任意一个位置开始比较。遍历一遍这个比较的起点,从这个起点开始跟A比较,看有多少相等的。用一个变量维护这个添加字符前最多相等的数量。由于是可以添加任何字符,我们默认添加多少,就有多少个相等,即两个字符的长度差。排个序,遍历一遍数组,看当前元素的前一个元素是否能通过不断乘2来等于它。01背包,只不过最大价值变成了最大利用空间。求最少不相等的位数,可以先求最多相等的位数。最小剩余空间,即v-最大利用空间。

2024-05-08 23:35:05 314 2

原创 【笔试训练】day21

如果str[l]==str[r],说明fun(l,r)=fun(l+1,r-1)+2。因为,相同的两个字符是一定可以添加到子序列回文串的首尾两端的。如果不相等,那就往长度减一的子序列里面去找,即fun(l+1,r),或者·fun(l,r-1)。dp[l][r]表示,[l,r]的范围内的回文字符串最长能到多少。后面这个数一定比2大,所以交换之后2原来的位置的那个数一定符合要求。从2开始,看左右两边是不是都大于他或者都小于他,如果不是,说明要调整位置。由于题目已经交上去了,就没写递归版本的代码了。

2024-05-07 21:46:11 457 2

原创 【笔试训练】day20

所以在经过min(n,m)轮回合之后,他们两个人至少死一个。枚举每一个区间的右端点,f[i]表示以第i个元素结尾的区间的最大和是多少。对于对立来说他最多承受n轮光的攻击,对于光来说,他最多承受立得m轮攻击。遇到这种连续得区间题目,要么枚举左右端点,要么就是枚举右端点。直接计算出经过几轮攻击后,会出现人员伤亡。自己去推一下就好了。

2024-05-06 23:40:36 314 1

原创 如何使git提交的时候忽略一些特殊文件?

在生成远程仓库的时候我们会看到这样一个选项:这个.gitignore文件有啥用呢?.gotignore文件是Git版本控制系统中的一个特殊文件。用来。也就意味着,如果我们,那么就可以将这些文件名添加到.gitignore文件中。在提交的时候,git会扫描提交的修改文件中有没有被.gitignore标记的文件,如果有,那就忽略这个文件的提交。比如,在项目开发中时常会产生一些的临时文件,我们又不想让这些临时文件被一起推送到远端仓库上去,我们就可以将这些临时文件的后缀名以*.后缀的方式忽略提交这些文件。

2024-05-06 16:17:34 896 4

原创 我的创作纪念日

开始的时候觉得没有必要写博客,自己做好笔记就行了,可是后来发现写博客跟做笔记是不一样的。对于写博客来说,坚持才是开始,所以写博客除了这些表面数据的收获外,我还明白了--学如逆水行舟,不进则退。虽然写博客是一件非常花时间和精力的事情,但是收获是非常大的。这个深刻可能不是你学习之后就有的,而是在写博客的过程中获得的。自己想成为一个c++全栈工程师,虽然目前掌握的程度还不够,但是会继续加油的。原理其实非常简单,但是在写的过程中发现了很多很多的bug,写完整个代码花了不到半小时,但是debug花了三个小时!

2024-05-06 15:52:01 314

原创 【笔试训练】day19

分别指向第一个字符串和最后一个字符串。只需要判断这俩字符串有没有相同的元素,如果没有,说明一定不能构成回文串。有则l++,r--继续找相同。想一下我们是怎么判断一个字符串是不是回文字符串的。从两边到中间不断的看是不是相同字符。快速判断俩字符串有没有相同元素,可以用位运算。或者用一个map遍历也可以。跟着题目一路模拟就行,注意longlong。同样的,我们也可以从n个字符串中,

2024-05-05 21:21:57 242 3

原创 【STL】map和set的原理及其使用

在c++文档中是这么定义setset是按照一定次序存储元素的容器,其中控制比较逻辑,默认是小于。可以是一个仿函数,也可以是一个函数指针。set中的key必须是唯一的。不能修改key但是可以删除或者插入一个key。在内部,set中的元素总是按照其内部比较对象(类型比较)所指定的特定严格强弱排序准则进行排序。set访问元素的平均时间复杂度为O(logn).set的底层是通过二叉搜索树(红黑树)来实现的。

2024-05-04 19:54:55 830 2

原创 【笔试训练】day18

因为j-vw[i-1][0]一定小于j,不会影响到以及遍历过的dp[j]拿还是不拿,拿的话就dp[j-vw[i][0]]+vw[i-1][1],不拿就dp[j](i-1时)。双指针维护一个相同字符的区间。注意个数可能是一个两位数,得用tostring.优先把甜度高的排在前面,甜度一样就优先酸度低的。dp[j]表示背包容量为i时能最多存放多少重量。

2024-05-04 14:33:56 359

空空如也

空空如也

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

TA关注的人

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