自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 B树和MySql索引

MyISAM引擎是MySQL5.5.8版本之前默认的存储引擎,不支持事物,支持全文检索,使用B+Tree。照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为。上图是以以Col1为主键,MyISAM的示意图,可以看出MyISAM的索引文件仅仅保存数据记录的。引要求key是唯一的,而辅助索引的key可以重复。这种索引叫做聚集索引。B+树是B树的变形,是在B树基础上优化的多路平衡搜索树,B+树的规则跟B树基本类似,但是又。这个索引的key是数据表的主键,因此。

2024-02-27 10:05:20 1205 2

原创 CPP项目:Boost搜索引擎

函数来说,我们有两种方法实现它,可以直接调用jieba分词工具直接使用,生成关键字分词,这样做的情况下可能会生成较多的暂停词,搜索结果可能又不太准确的情况,所以我们可以去掉暂停词,这样可以减小关键词的数量,减小查找次数,二区掉暂停词依然需要调用Jieba分词库当中的函数。由于我们使用的是cppjieba分词工具,所以我们需要在使用的时建立分词路径,防止出现错误,在建立cppjieba类的时候,我们也是创建的单例模式,只需要建立一个对象即可,不需要创建多个对象,这和建立索引时候的功能是一样的。

2024-02-07 17:35:08 2912

原创 MySql的使用方法

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。

2024-01-26 15:49:16 1216 2

原创 八大架构演进之路

缺点:运维复杂度高:业务不断发展,应用和服务都会不断变多,应用和服务的部署变得复杂,同一台服务器上部署多个服务还要解决运行环境冲突的问题,此外,对于如大促这类需要动态扩缩容的场景,需要水平扩展服务的性能,就需要在新增的服务上准备运行环境,部署服务等,运维将变得十分困难;初期, 我们需要利用精干的技术团队快速将业务系统投入市场进行检验,并且可以快速相应变化需求,但好在前期用户访问人数较少,没有对性能提出,安全提出要求,并且架构简单,无需专业的运维团队,单机架构是合适的。缺点:技术栈变多,对研发团队要求高;

2024-01-13 16:57:35 1292 2

原创 C/C++--ProtoBuf使用

对于使用了枚举类型的字段,包含设置和获取字段的方法,已经清空字段的方法clear_;以上三种序列化的方法没有本质区别,只是序列化之后输出的格式不同,可以提供不同场景使用,序列化的 API 函数均为const成员函数,因为序列化不会改变类对象的内容, 而是将序列化的结果保存到函数入参指定的地址中。上述的例子中,每个字段都有设置和获取的方法,getter 的名称与小写字段完全相同,setter 方法以 set_ 开头,每个字段都有一个clear_的方法,可以将字段设置为empty状态。编译该项目会出现异常。

2024-01-12 20:16:38 1862 4

原创 高并发内存池

内存碎片分为外碎片和内碎片,外碎片是频繁地向操作系统申请内存,释放内存,导致内存不连续,内存不连续导致我们虽然有内存但是由于内存小于我们需要的,而导致我们无法使用,内碎片由于我们在动态申请内存的时候,由于内存对齐的原因,导致我们实际申请的内存大于等于我们实际需要的内存,这样就会导致多出来的内存无法使用,造成资源的浪费。1.ThreadCache:线程缓存是每个线程独有的,用于小于64k的内存的分配,所以不用加锁,每个线程独享一个ThreadCache,这是并发线程池高效的地方,本质是由哈希映射的链表实现。

2023-11-26 14:10:07 2163 2

原创 Linux--网络概念

IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4,IP地址是在IP协议中, 用来标识网络中不同主机的地址;: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.这是一台计算机的工作原理,对于多台计算机,这是如何工作的呢?

2023-11-18 20:04:45 695 2

原创 Linux--线程概念+线程控制

1.什么是线程相对于进程而言,进程是承担资源调度的实体,线程在进程内部运行,是操作系统调度的基本单位。在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

2023-11-14 23:57:06 159

原创 Linux--信号

第一个参数为信号,可以是信号的编号,也可以是信号的名称,第二个参数是一个回调函数,通过回调函数处理信号,可以为默认,忽略,自定义。用户调用系统接口,执行OS所对应的代码,OS设置参数,OS向目标进程写入,OS修改对应的位图结构,进程后续执行所对应的信号。键盘的工作方式是通过中断的方式进行的,OS解释组合键,然后在进程列表中查找,找到前台运行的进程,OS将信号写入当前的进程结构中的位图中。进程有不同的用户空间,但是只有一个内核空间,不同进程的用户空间的代码和数据是不一样的,但是内核空间的代码和数据是一样的。

2023-11-09 13:35:14 123 2

原创 Linux--进程间通信

共享内存实在堆栈之间的区域的,堆栈相对而生,中间区域为共享内存,不用经过操作系统。因为如果是管道,需要从键盘写入,然后再拷贝到自己定义的缓冲区中,然后再次拷贝到内存中,再从内存中拷贝到用户级缓冲区中,最后再拷贝到屏幕中,需要经历最少4词的拷贝过程。结论:双方进程,可以看到同一份文件,,该文件一定在系统路径中,路径具有唯一性,管道文件可以被打开,但是不会将内存中的数据刷新到磁盘中。为了进行进程间通信,需要让不同的进程看到相同的一份资源,所以之前的管道,本质都是优先解决一个问题,让不同的进程看到同一份资源!

2023-11-07 17:51:46 163 1

原创 Linux--动静态库

结果:软硬链接的本质区别为有没有inode编号,有的为软链接,没有的为硬链接,然后硬链接就是在指定目录下创建文件名和inode的映射关系,相当于起别名,而软链接相当于在windows下的快捷方式,引用计数为2的原因就是因为硬链接是拷贝了一份一模一样的文件,所以应用计数+1;删除硬链接的一份文件之后,引用计数-1,减到0之后删除文件,删除软连接不会造成文件删除,只是删除了快捷方式。这是软硬链接的区别。静态库:就是将.c为后缀的文件转换为以.o为结尾的二进制文件,然后打包制作为静态库,将静态库封装为库文件。

2023-11-03 16:59:38 83 1

原创 Linux--文件操作

文件描述符:就是一个小整数,最小0开始,0,1,2默认为 stdin,stdout,stderr,如果这三个文件没有被关闭,则创建的文件的文件描述符从3开始,如果被关闭,则从最小的被关闭的文件描述符开始;对于操作系统来讲:只要可以input读取,或者可以output写出的设备就叫文件,狭义的文件:普通的文件,广义的文件:显示器,键盘,网卡,显卡,磁盘等几乎所有的外设,都可以称之为文件。所以,想要文件修改文件的内容,只能是操作系统才可以实现,如果是用户想要实现,就必须使用,操作系统提供的接口函数才能实现。

2023-10-31 17:29:32 140 1

原创 Linux--进程替换

所以:exec*系列函数执行的结果为替换原来的进程,执行成功后,会将原来的代码和数据进行替换,包括已经执行的和没有执行的。程序替换就是通过特定的接口,加载磁盘上的程序,替换子进程原有的程序,加载到调用进程的地址空间中。在加载新程序之前,父子进程一般为代码共享,数据写时拷贝,但有可能代码和数据同时发生写时拷贝。在fork函数之后,父子进程各自执行代码的一部分,但是如果子进程想要执行一份全新的程序呢?通过进程替换来完成,进程替换就是父子进程代码发生写时拷贝,子进程执行自己的功能。其他的exec*系列函数。

2023-10-28 21:09:39 381

原创 Linux--进程等待

1.对于每个进程来说,如果子进程终止,父进程没有停止,就会形成僵尸进程,导致内存泄露,为了防止僵尸进程的形成,父进程需要等待子进程,进而解决内存泄漏的问题。2.我们通过进程等待,进而了解子进程的退出情况,知道子进程在干什么,了解子进程完成的怎么样了。父进程要拿子进程的数据信息,为什么要用wait/waitpid等系统调用借口呢?父进程可以什么都不做,处于阻塞状态,直到子进程运行结束,父进程开始回收子进程。父进程通过调用wait/waitpid进行僵尸进程的回收问题。父进程等待,期望获得子进程哪些信息呢?

2023-10-26 22:58:48 359 1

原创 Linux--进程终止

答案当然是没有作用的,因为进程出现异常之后,代码没有运行完成,也就是没有都到return语句这里,在return 语句之前退出的,这样就导致了退出码异常,退出码没有发挥作用。所以,退出码对于父进程是重要的。进程退出之后,我们需要判断是否是进程异常退出,还是正常退出,如果是异常退出,则不需要关心退出码,正常退出,则关心退出码。对于main函数的返回值,本质表示:进程结束之后是否正确的结果,如果不正确,可以用不同的数字,来表示不同的结果,所代表的出错原因。进程的退出码,代表的是进程的结果的是否正确。

2023-10-20 21:50:04 359

原创 C++--位图和布隆过滤器

100亿个·整数,1G内存,这道题和上一道题差不多,依然使用两各位图,用来存储在或不在的情况,将一个文件的整数放在一个位图中,遍历另一个文件,然后判断,如果两个都为1,则存在,然后将这个数字所在的位置置为0,因为判断交集,只用考虑在或不在,不用考虑个数。由于有40亿个数字,40亿个int的大小为16G,如果放在内存中是,开销是非常大的,只能使用位图来解决,因为一个int可以放32个数据,int的大小为4字节,32比特位,40亿整数的大小大约为512MB,完全可以存放下。当然,其他类型也可以。

2023-10-02 22:26:50 403 1

原创 C++--哈希表的实现及unorder_set和unorder_map的封装

该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表)。unorder_set是用来存储的关联式容器,可以用来快速的查找和去重,在内部是按照无序的方式排列的,它的迭代器和unorder_map的使用相同,其他的特性和unorder_map的特性差不多。通过哈希函数获取待插入元素在哈希表中的位置,如果该位置中没有元素则直接插入新元素,如果该位置中有元素发生哈希冲突,使用线性探测找到下一个空位置,插入新元素。

2023-09-19 16:05:30 430 19

原创 C++--简单实现定长内存池

在C/C++中,动态申请内存都是通过malloc来申请的,但是实际上不是是直接从堆上直接申请的内存,而是通过malloc动态申请一大块内存,malloc就相当于一块内存池,然后分给程序使用,如果申请的内存使用完或者不够需要申请的内存超过当前剩余的内存的时候,再去向操作系统申请内存。用完之后还给内存池的行为。但是,功能单一,只能解决定长的内存需求,另外占着内存没有释放。内存池主要解决的是在动态申请内存的时候,解决效率的问题,当然,还可以解决一些内存碎片化问题。1.什么是定长内存池。

2023-09-15 15:33:56 349 29

原创 git企业级使用

⽐⽅说你在⾃⼰电脑上改了⽂件A,你的同事也在他的电脑上改了⽂件A,这时,你们俩之间只需把各⾃的修改推送给对⽅,就可以互相看到对⽅的修改了。递增的数字,⽽是⼀个SHA1计算出来的⼀个⾮常⼤的数字,⽤⼗六进制表⽰(你看到的 commit id 和我的肯定不⼀样,以你⾃⼰的为准)注意 git commit 后⾯的 -m 选项,要跟上描述本次提交的message,由⽤⼾⾃⼰完成,这部分内容绝对不能省略,并要好好描述,是⽤来记录你的提交细节,是给我们⼈看的。要提前说的是,仓库是进⾏版本控制的⼀个⽂件⽬录。

2023-09-03 21:33:51 1753 10

原创 C++--动态规划其他问题

其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。有 7 种可能的计划:(0),(1),(2),(0,1),(0,2),(1,2),以及 (0,1,2)。至少产生 3 的利润,该集团可以完成工作 0 和工作 1 ,或仅完成工作 1。最大的子集是 {"0", "1"} ,所以答案是 2。返回满足题意的二叉搜索树的种数。给你一个二进制字符串数组。

2023-09-02 21:04:47 2635 28

原创 C++--完全背包问题

1.你有一个背包,最多能容纳的体积是V。现在有n种物品,每种物品有任意多个,第i种物品的体积为vivi​ ,价值为wiwi​。(1)求这个背包至多能装多大价值的物品?(2)若背包恰好装满,求至多能装多大价值的物品?

2023-08-31 21:14:54 1100 26

原创 C++--动态规划背包问题(1)

1.你有一个背包,最多能容纳的体积是V。现在有n个物品,第i个物品的体积为vivi​ ,价值为wiwi​。(1)求这个背包至多能装多大价值的物品?(2)若背包,求至多能装多大价值的物品?

2023-08-29 19:56:29 1391 30

原创 C++--两个数组的dp问题(2)

在 "leet" 中删除 "e" 将 101[e] 加入总和。如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。在 "delete" 中删除 "dee" 字符串变成 "let",' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。".*" 表示可匹配零个或多个('*')任意字符('.')。"a" 无法匹配 "aa" 整个字符串。"a" 无法匹配 "aa" 整个字符串。

2023-08-27 20:42:09 426 11

原创 Linux--进程地址空间

所谓进程地址空间(process address space),就是从进程的视角看到的地址空间,是进程运行时所用到的虚拟地址的集合。2.地址空间存在的价值。

2023-08-26 19:12:19 763 1

原创 Linux--线程地址空间

父子进程各种有一份虚拟空间地址,在子进程刚被创建时,父子进程代码和数据共享,所以此时虚拟地址空间的内容是基本一样的(当然有部分数据不同,比如各子的id等),且映射关系也是一样的,但是当子进程对数据进行修改时,子进程对那份数据进行写时拷贝,所以物理空间地址发生了变化,但是虚拟地址还是没有发生变化,只是改变了子进程的页表中那份虚拟地址的映射关系而已,所以两个相同的虚拟地址在父子进程分别看到了不同的物理地址空间。这是一张程序地址分布的图,通过一段代码来证明地址空间的分布情况。

2023-08-25 20:37:32 423 9

原创 C++--动态规划两个数组的dp问题

但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。最长公共子序列是 "ace" ,它的长度为 3。最长公共子序列是 "abc" ,它的长度为 3。以这种方法绘制线条,并返回可以绘制的最大连线数。可以画出两条不交叉的线,如上图所示。是这两个字符串所共同拥有的子序列。

2023-08-23 21:50:43 530 10

原创 c++--动态规划回文串问题

i. 当⾸尾两个元素「相同」的时候,也就是 s[i] == s[j] :那么 [i, j] 区间上的最⻓回⽂⼦序列,应该是 [i + 1, j - 1] 区间内的那个最⻓回⽂⼦序列⾸尾填上s[i] 和 s[j] ,此时 dp[i][j] = dp[i + 1][j - 1] + 2。取两者的最⼤值,于是 dp[i][j] = max(dp[i][j - 1], dp[i + 1][j])。= s[j] 时: dp[i][j] = max(dp[i][j - 1], dp[i + 1][j])

2023-08-22 21:51:12 1438 29

原创 C++--深度理解智能指针

智能指针是行为类似于指针的类对象。auto_ptr(C++98的方案,C++11已经废弃):采用所有权模式,对于特定的对象,只能有一个智能指针可拥有它,这样只有拥有对象的智能指针的析构函数会删除该对象。由于auto_ptr支持拷贝构造,为了确保指针所有者唯一,这里转移了所有权,转移所有权之后,导致了被拷贝的为空了,这是一大缺点,导致auto_ptr被遗弃。基本原理:就是记录对象被引用的次数,当引用次数为 0 的时候,也就是最后一个指向该对象的共享指针析构的时候,共享指针的析构函数就把指向的内存区域释放掉。

2023-08-21 21:32:09 777 24

原创 c++--Map和Set的简单封装

Map和set没有多大区别,它俩都是键值对容器,即该结构中一般只包含两个成员key,value,key代表键值,value表示与key对应的信息。并且这两个容器为树型结构的关联式容器,这两种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。由于Map和Set的底层都为红黑树,所以Map和Set的实现通过对红黑树的封装来实现,Set为一个参数,Map为两个参数,所以通过改变模板来实现Map和Set的同时封装。1.Map和Set的简单介绍。2.Map和Set的实现。

2023-08-20 17:07:36 332 5

原创 C++--红黑树

检测新节点的插入,需要判断是否破坏了红黑树的性质,因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何性质,则不需要调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连在一起的红色节点,此时需要对红黑树分情况来讨论。4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点,即每条路径黑色节点相同。3. 如果一个节点是红色的,则它的两个孩子结点是黑色的,即红色不能连续。5. 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)

2023-08-18 21:01:21 529 8

原创 c++--SLT六大组件之间的关系

迭代器:迭代器的出现连接了容器和算法,隐藏了算法和容器底层的实现细节,降低了使用成本,如果没有迭代器,则算法和容器将直接暴露在用户面前,使封装性减低。容器:容器是STL最基础的组件,没有容器,就没有数据,容器的作用就是用来存储数据的,在不同的场景下使用不同的容器,保证了数据使用的高效率和低空间。算法:算法是解决问题的思想和实施步骤;而编程就是算法的实现,不同算法的实现对于数据的处理来说是重要的,没有算法,也就没有了正确的数据。容器,迭代器,算法,仿函数,适配器,空间配置器。2.六大组件之间的关系。

2023-08-17 19:50:29 498 4

原创 C++--类型转换

在传统C语言中,由强制类型转换和隐式类型转换,隐式类型转换,编译器在在编译阶段自动处理,能转换则转换,强制类型转换由用户自己转换。在static_cast中,它的使用方法相对于C语言中的隐式类型转换,只能转换两种类型比较接近的,不能用于不相干类型的转换。// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回。在C++中,也可以使用C语言的转换方式,但在C++中,有自己的转换方式,// 如果pa是指向子类,那么可以转换,转换表达式返回正确的地址。域,以减少发生错误的机会。

2023-08-16 21:28:26 189 1

原创 c++--智能指针简单描述

智能指针是你在堆栈上声明的类模板,并可通过使用指向某个堆分配的对象的原始指针进行初始化。智能指针析构函数包括要删除的调用,并且由于在堆栈上声明了智能指针,当智能指针超出范围时将调用其析构函数,尽管堆栈上的某处将进一步引发异常。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为 设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等 等,出现内存泄漏会导致响应越来越慢,最终卡死。

2023-08-15 21:46:26 326 20

原创 c++--异常

3. 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。1. 异常对象定义好了,相比错误码的方式可以清晰准确的展示出错误的各种信息,甚至可以包含堆栈调用的信息,这样可以帮助更好的定位程序的bug。1. 异常会导致程序的执行流乱跳,并且非常的混乱,并且是运行时出错抛异常就会乱跳。C++异常是一种处理错误的方式,当一个函数无法处理出现的错误的时候,可以抛出异常,这个函数会直接或间接让调用者处理错误。

2023-08-14 21:41:51 503 17

原创 c++--右值引用

右值引用做返回值和参数可以提高效率,在bit::string中增加移动构造,移动构造本质是将参数右值的资源窃取过来,占位已有,那么就不用做深拷贝了,所以它叫做移动构造,就是窃取别人的资源来构造自己。按照语法,右值引用只能引用右值,但右值引用一定不能引用左值吗?在C++11之前,是没有右值引用的,只有左值引用,在C++11中,才更新了右值引用,不管是左值引用还是右指针用,其本质都是为对象起别名。1.左值引用不能引用右值,但加const之后可以引用,即const左值引用即可以引用左值,也可以引用右值。

2023-08-12 21:50:55 451 3

原创 c++ 子数组动态规划问题

请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。乘积为正数的最长子数组是 [-1,-2] 或者 [-2,-3]最长乘积为正数的子数组为 [1,-2,-3] ,乘积为 6。从子数组 [3] 和 [3,-2,2] 都可以得到最大和 3。连续子数组 [4,-1,2,1] 的和最大,为 6。结果不能为 2, 因为 [-2,-1] 不是子数组。

2023-08-11 14:06:21 492 19

原创 c++--AVL树简单实现

AVL树就是在搜索二叉树的基础上通过控制左右子树的高度差实现的,在搜索二叉树的基础上,通过旋转来控制,是左右子树高度差的绝对值严格控制为不超过1(通过旋转来控制树的高度)。2. 如果平衡因子为正负1,说明插入前pParent的平衡因子一定为0,插入后被更新成正负1,此时以pParent为根的树的高度增加,需要继续向上更新。AVL树最重要的就是旋转,需要控制左右子树高度差的绝对值不超过1,因此,平衡因子可能存在三种情况,即0,正负1,正负2,如果一棵二叉搜索树是高度平衡的,它就是AVL树。

2023-08-09 22:08:39 313 22

原创 c++--二叉树应用

1.根据二叉树创建字符串给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。来源:力扣(LeetCode)2.二叉树分层遍历给你二叉树的根节点root,返回其节点值的。(即逐层地,从左到右访问所有节点)。示例 1:输入:root = [3,9,20,null,null,15,7]

2023-08-06 10:50:52 289 6

原创 c++--简单多状态动态规划问题

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3。解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2。解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3。

2023-08-03 19:49:50 734 23

原创 二叉树迭代遍历

后序遍历和中序遍历差不多,中间多了一步判断的步骤,只需设置一个空指针,然后判断是否左节点是否为空,不为空则先遍历右节点,空指针的目的是为了防止重复遍历。PS:以下代码均为C++实现。给定一个二叉树的根节点。3.二叉树的后序遍历。给你一棵二叉树的根节点。

2023-08-02 21:22:20 467 17

空空如也

空空如也

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

TA关注的人

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