- 博客(78)
- 收藏
- 关注
原创 kafka为什么这么快?RocketMQ哪里不如Kafka?
从名字可以看出,就是用来发送文件数据的程序发起系统调用sendfile,内核会将数据从磁盘设备拷贝到内核空间的缓冲区,内核空间缓冲区里的数据可以直接拷贝到网卡,整个过程发生了一次系统调用,对应两次用户空间和内核空间的切换,以及两次数据拷贝。read将磁盘数据从设备拷贝到内核空间的缓冲缓冲区,再从内核空间的缓冲区拷贝到用户空间,程序再发起系统调用,write将数据从用户空间拷贝到socket的发送缓冲区,再从socket。空间和内核空间的切换,以及三次数据拷贝对比之前,省下一次内核空间到用户空间的拷贝。
2024-10-05 21:19:29
430
原创 Redis可以用来做什么?
2、使用 Sorted Set 实现延时队列:将任务的执行时间戳作为score,将任务数据作为value,将任务插入到zset中,每个任务有一个唯一的id(比如订单id),以及任务执行时间(比如30min),任务内容(比如订单超时支付系统自动取消)等信息体。然后另起一个线程,该线程会周期性地从zset中取出score小于当前时间戳的任务并执行,执行任务后,通过Redis的remove命令删除已经成功执行的任务即可。使用 Redis 的计数器和过期时间等功能来实现限流和速率控制,防止系统过载和恶意攻击。
2024-10-05 21:10:18
342
原创 InnoDB数据存储结构
B+树的每一层中的页都会形成一个双向链表,如果是以页为单位 来分配存储空间的话,双向链表相邻的两个页之间的物理位置 可能离得非常远。我们介绍B+树索引的适用场景的时候特别提到范围査询只需要定位到最左边的记录和最右边的记录,然后沿着双向链表一直扫描就可以了,而如果链表中相邻的两个页物理位置离得非常远,就是所谓的随机I/0,再一次强调,磁盘的速度和内存的速度差了好几个数量级,随机I/0是非常慢的,所以我们应该尽量让链表中相邻的页的物理位置也相邻,这样进行范围查询的时候才可以使用所谓的顺序I/O。
2024-10-05 21:01:26
697
原创 JVM快速入门
栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法(一个方法就是一个栈帧),在栈帧中包括局部变量、操作数、动态链接方法(调用另外 的方法)、方法返回地址和一些额外的信息。Java虚拟机将描述类的数据从class字节码文件加载到内存,并且对数据进行校验,转化,解析,初始化的工作,最终形成在内存中可以直接使用的数据类型。总结:即创建一个对象的时候,对象所代表的类的信息存放在方法区,对象实例存放在堆,对象里面的局部变量、方法等存放在栈。而且加载某个类的class文件时,java虚拟机采用的是双亲委派模式。
2024-10-05 20:44:54
793
原创 集合的线程安全
ensurecapacityIntermal()的作用就是如果将当前的新元素加到列表后面,判断列表的 elementData 数组的大小是否满足。如果线程A和线程B同时进行put,刚好两条数据的hash值相同,如果线程A已经判断该位置数据为nul,此时被挂起,线程B正常执行,并且正常插入数据,随后线程A继续执行就会将线程A的数据给覆盖。1、继承HashMap,重写或者按要求编写自己的方法,这些方法要写成synchronized,在这些synchronized的方法中调用HashMap的方法。
2024-10-05 20:37:12
363
原创 并发编程简介
在设计良好的并发应用程序中,线程能提升程序的性能,但无论如何,线程总会带来某种程度的运行时开销。在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另一个线程时,就会频繁地出现上下文切换操作(Context Switch),这种操作将带来极大的开销:保存和恢复执行上下文,丢失局部性,并且CPU时间将更多地花在线程调度而不是线程运行上。如果为模型中每种类型的任务都分配一个专门的线程,那么可以形成一种串行执行的假象,并将程序的执行逻辑与调度机制的细节,交替执行的操作,异步I/O以及资源等待等问题分离开来。
2024-10-05 20:25:14
897
原创 操作系统概述
异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。虚拟:是指把一个物理上的实体变为若于个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的常考易混概念。并行:指两个或多个事件在同一时刻同时发生。
2024-10-05 18:01:53
220
原创 TCP应用层
文本模式:ASCI模式,以文本序列传输数据二进制模式:Binary模式,以二进制序列传输数据。网页中有其他网站的链接,万维网把各自独立的网站连接起来,方便从一个网页中跳转到另外的网站中。被动模式:服务端在指定范围内的某个端口被动等待客户端发起连接。控制连接:标准端口为21,用于发送FTP命令信息。主动模式:服务端从20端口主动向客户端发起连接。数据连接:标准端口为20,用于上传、下载数据。例如在hao123的网站中跳转到其他网站中。互联网传输文件大多用ftp协议。
2024-10-05 17:47:25
126
原创 TCP传输层
一般不需要分段的数据用UDP协议 (域名解析需要UDP协议,QQ聊天),也有例外就是屏幕广播和多播等传输内容分段但是用UDP协议。TCP是面向连接的传输层协议。UDP 协议一个数据包就能够完成数据通信,不分段,不需要建立会话,不需要流量控制,不可靠传输。UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制UDP 是面向报文的。TCP 需要将要传输的文件分段传输,建立会话,可靠传输。UDP 支持一对一、一对多、多对一和多对多的交互通信。UDP 是无连接的,即发送数据之前不需要建立连接。
2024-10-05 17:41:09
225
原创 TCP网络层
ping指的是端对端连通,通常用来作为可用性的检查但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。127.0.0.1是回送地址,指本地机,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。私网地址只存在于内网中,不同的内网可建立相同的私网IP地址,但是私网地址不存在外部互联网中,因此外部计算机无法访问私网地址。主机部分不能为全1,全1是广播,也不能为全0,全0表示一个网段。
2024-10-05 17:30:03
155
原创 TCP数据链路层
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER (Bit Error Rate)。CRC 是一种常用的检错方法,而FCS是添加在数据后面的余码,FCS 可以用 CRC这种方法得出,但CRC并非用来获得FCS的唯一方法。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。现最常用的方法是使用适配器(即网卡)来实现这些协议的硬件和软件。是一条点到点的物理线路段,中间没有任何其他的交换结点一条链路只是一条通路的一个组成部分。这种信道使用一对一的点对点通信方式。
2024-10-05 17:22:20
149
原创 TCP物理层
在任何信道中,码元传输的速率是有上限的,否则就会出现码间串扰的问题,使接收端对码元的判决(即识别)成为不可能。如果信道的频带越宽,也就是能够通过的信号高频分量越多,那么就可以用更高的速率传送码元而不出现码间串扰。基带信号(即基本频带信号)–来自信源的信号。基带信号就是发出的直接表达了要传输的信息的信号,比如我们说话的声波就是基带信号。香农(Shannon)用信息论的理论推导出了带宽受限且有高斯白噪声干扰的信道的极限、无差错的信息传输速率。信道的带宽或信道中的信噪比越大,则信息的极限传输速率就越高。
2024-10-05 17:14:21
394
原创 计算机网络概述
但最下面的网络接口层并没有具体内容因此往往采取折中的办法,即综合 OSI和 TCP/IP 的优点,采用一种只有五层协议的体系结构。1、电脑访问DNS服务器,询问网页地址所对应的IP地址,DNS解析域名后将对应的IP地址返回给电脑。只要遵循 OS|标准,一个系统就可以和位于世界上任何地方的、也遵循这同一标准的其他任何系统进行通信。根据提供服务的覆盖面积大小以及所拥有的IP 地址数目的不同,ISP 也分成为不同的层次。厂商出厂时mac地址唯一,但是自己可以修改mac地址,所以可能会出现相同的mac地址。
2024-10-05 17:02:31
451
原创 STM32 DMA
DMA外设寄存器的地址对应的就是内部FLASH(我们这里把内部FALSH当作一个外设来看)的地址,DMA存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储来自内部FLASH的数据)的地址。DMA外设寄存器的地址对应的就是串口数据寄存器的地址,DMA存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储通过串口发送到电脑的数据)的地址。DMA外设寄存器的地址对应的就是ADC数据寄存器的地址,DMA存储器的地址就是我们自定义的变量(用来接收存储AD采集的数据)的地址。(1)标号1:DMA请求。
2024-10-05 16:14:35
654
原创 STM32 SPI通信
SPI的全称是"Serial Peripheral Interface”,意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。
2024-10-05 16:09:37
228
原创 STM32 I2C总线
如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。这个信号是由对从机的“非应答”来实现的。在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/W),用“0”表示主机发送(写)数据(W)“1”表示主机接收数据®。当主机发送了一个地址后,总线上的每个器件都将头7位与它自己的地址比较,如果一样,器件会判定它被主机寻址,其他地址不同的器件将被忽略后面的数据信号。
2024-10-05 16:07:13
864
原创 STM32串口通信
2.1 串口通信简介串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。(1)接口标准串口通信的接口标准有很多,有RS-232C、RS-232、RS-422A、RS-485等。常用的就是RS-232和RS-485。RS-232其实是RS-232C的改进,原理是一样的。
2024-10-05 15:58:37
610
原创 嵌入式通信系统
此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,即保持位同步关系,也保持字符同步关系发送方对接收方的同步可以通过两种方法实现。异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”的整数倍。串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
2024-10-05 15:51:31
329
原创 STM32定时器
STM32F1的定时器非常多,由2个基本定时器(TIM6、TIM7)、4个通用定时器(TIM2-TIM5)和2个高级定时器(TIM1、TIM8)组成。通用定时器是在基本定时器的基础上扩展而来,增加了输入捕获与输出比较等功能。STM32F1的通用定时器TIMx(TIM2-TIM5)具有如下功能:(1)16 位向上、向下、向上/向下自动装载计数器(TIMX CNT)(2)16 位可编程(可以实时修改)预分频器(TIMx PSC),计数器时钟频率的分频系数为 1~65535之间的任意数值。
2024-10-05 15:41:39
226
原创 STM32中断系统
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。STM32F103芯片支持60个可屏蔽中断通道,每个中断通道都具备自己的中断优先级控制字节(8位,但是STM32F103中只使用4位高4位有效),用于表达优先级的高4位又被为组成抢占式优先级和响应优先级,通常也把响应优先级称为“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。
2024-10-05 15:36:36
167
原创 嵌入式存储器
DRAM为动态RAM(Dynamic RAM/DRAM),DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的(内存条)。SRAM为静态RAM(Static RAM/SRAM),SRAM速度非常快,是目前读写最快的存储设备,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲(如Cache)。NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。
2024-10-05 15:29:39
417
原创 MQ的相关概念
MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常 见的上下游「逻辑解耦 + 物理解耦」的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。#为什么要用MQ流量消峰举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。
2024-10-05 12:00:44
457
原创 RabbitMQ 入门案例
Work Queues 是工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。在下图中,“ P” 是我们的生产者,“ C” 是我们的消费者。案例中生产者叫做 Task,一个消费者就是一个工作队列,启动两个工作队列消费消息,这个两个工作队列会以轮询的方式消费消息。轮询消费消息指的是轮流消费消息,即每个工作队列都会获取一个消息进行消费,并且获取的次数按照顺序依次往下轮流。值得一提的是,basicConsume 的参数中,第三个和第四个参数都是接口,所以需要实现该接口的方法。
2024-10-05 11:58:33
539
原创 RabbitMQ 介绍
Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑 RabbitMQ 是 一个快递站,一个快递员帮你传递快件。
2024-10-05 11:50:02
343
原创 为什么事务@Transactional会失效?
而调用类内部的 @Transactional 修饰的方法时,也是因为没有成功调用代理对象,是通过 this 来调用方法的,所以事务也失效了;上述代码在添加用户之后即使遇到了异常,程序也没有执行回滚,这是因为 @Transactional 是基于 Spring AOP 实现的,而 Spring AOP 又是基于动态代理实现的,而当调用类内部的方法时,不是通过代理对象完成的,而是通过 this 对象实现的,这样就绕过了代理对象,从而事务就失效了。如果方法在执行期间,出现了异常,那么它会自动回滚事务。
2024-10-05 11:02:43
1043
原创 【设计模式】MVC模式&前端控制器模式
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。使用 StudentController 方法来演示 MVC 设计模式的用法。
2024-10-04 18:24:11
997
原创 【设计模式】外观模式
这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。假设一台电脑,它包含了 CPU(处理器),Memory(内存) ,Disk(硬盘)这几个部件,若想要启动电脑,则先后必须启动 CPU、Memory、Disk。应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。2、定义系统的入口。
2024-10-04 18:21:23
427
原创 【设计模式】原型模式
关键代码: 1、实现克隆操作,在 JAVA 继承 Cloneable,重写 clone(),在 .NET 中可以使用 Object 类的 MemberwiseClone() 方法来实现对象的浅拷贝或通过序列化的方式来实现深拷贝。缺点: 1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。
2024-10-04 18:20:27
704
原创 【设计模式】责任链模式
3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。每个记录器中的下一个记录器代表的是链的一部分。
2024-10-04 18:18:19
800
原创 【设计模式】解释器模式
这种模式实现了一个表达式接口,该接口解释一个特定的上下文。何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。使用场景: 1、可以将一个需要解释执行的语言中的句子表示为一个抽象语法树。InterpreterPatternDemo,我们的演示类使用 Expression 类创建规则和演示表达式的解析。意图:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。2、增加了新的解释表达式的方式。3、易于实现简单文法。
2024-10-04 18:16:01
258
原创 【设计模式】迭代器模式
我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。注意事项:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。使用场景: 1、访问一个聚合对象的内容而无须暴露它的内部表示。3、为遍历不同的聚合结构提供一个统一的接口。缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
2024-10-04 18:14:30
396
原创 【设计模式】策略模式
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。缺点: 1、策略类会增多。
2024-10-04 18:12:32
251
原创 【设计模式】模板模式
应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。我们将创建一个定义操作的 Game 抽象类,其中,模板方法设置为 final,这样它就不会被重写。缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。何时使用:有一些通用的方法。
2024-10-04 18:11:05
399
原创 【设计模式】装饰器模式
然后我们创建一个实现了 Shape 接口的抽象装饰类 ShapeDecorator,并把 Shape 对象作为它的实例变量。主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。创建实现了 Shape 接口的抽象装饰类。
2024-10-04 18:09:19
828
原创 【设计模式】观察者模式
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。比如,当一个对象被修改时,则会自动通知依赖它的对象。意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。Observer 的实体类。
2024-10-04 18:06:17
561
原创 【设计模式】工厂模式&抽象工厂模式
3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具 体类的依赖。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。
2024-10-04 18:04:23
1102
原创 【设计模式】代理模式
5、Cache代理。主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。注意事项: 1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2024-10-04 17:59:40
499
原创 【设计模式】适配器模式
2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。
2024-10-04 17:56:47
599
原创 快速排序总结
(2)然后,左边和右边的数据可以独立排序。对于左侧的数据,又可以取一个分界值,将该部分数据分成左中右三部分,同样在左边放较小值,中间放等于值,右边放较大值。(3)重复上述过程,可以看出,这是一个递归过程。(1)将小于分界值的数据集中到数组的左边,等于分界值的数据集中到数组的中间,大于分界值的数据集中到数组右边。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。输入: [3,2,3,1,2,4,5,5,6], k = 4。输入: [3,2,1,5,6,4], k = 2。
2024-10-04 16:46:49
125
原创 回文子串 & 最长回文子串
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。给你一个字符串 s,找到 s 中最长的回文子串。
2024-10-04 16:43:14
146
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人