leetcode经典动态规划解题报告

leetcode70 爬楼梯题目描述 123假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 解答:递推公式: 设f(n)为n阶楼梯的爬法f(n)=f(n-1)+f(n-2) n>2f(n)=1 n=1f(n)=2 n=2到达第n阶楼梯,有两种方法,一种是从第n-1阶楼梯,走一步到;另一种是从n-2阶楼梯,走两步到。 根据以上的递归公式,我们很容易写出下面的代码: 12345678910111213public int climbStairs(int n) { if (n<3){ return n; } int[] dp=new int[n+1]; dp[1]=1; dp[2]=2; for(int i=3;i<=n;i++){ dp[i]=dp[i-1]+dp[i-2]; } return dp[n]; }

Netty启动原理

典型的Netty服务端启动代码:12345678910111213141516171819202122232425262728293031323334353637public class MyServer { public static void main(String[] args) throws Exception{ EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup,workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); //入站编码处理器 pipeline.addLast(new MyByteToLongDecoder()); //出站的handler进行编码 pipeline.addLast(new MyLongToByteEncoder()); //自定义的handler 处理业务逻辑 pipeline.addLast(new MyServerHandler()); } }); ChannelFuture channelFuture = serverBootstrap.bind(7000).sync(); channelFuture.channel().closeFuture().sync(); }finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }}

web安全基础知识一

常见网站应用攻击方式XSS攻击XSS攻击即跨站点脚本攻击(cross site script),指黑客通过篡改网页,注入恶意HTML脚本,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式。常见的XSS攻击的类型有两种: 反射型:攻击者诱使用户点击一个嵌入恶意脚本的连接,达到攻击的目的。 持久型:黑客提交包含恶意脚本的请求,保存在被攻击的web站点的数据库中,用户浏览网页时,恶意脚本就被包含在正常页面中,达到攻击的目的。

SpringBoot自动配置原理

简介SpringBoot相较于Spring的一大进步就是它简化了配置。SpringBoot遵循”约定优于配置”的原则,使用注解对一些常规的配置项做默认配置,减少或不使用xml配置。Springboot还提供了大量的starter,只需引入一个star...

跟踪SpringMVC请求过程

整体流程 所有的请求都被拦截到DispatcherServlet,它也是一个Servlet,执行doService 快照请求中的所有的参数,将框架中的一些对象设置到request对象中。 调用doDispatch(request,response)方法 调用getHandler方法获取对应的Handler 调用getHandlerAdapter拿到对应的HandlerAdapter 应用拦截器的PreHandler,如果拦截器的PreHandeler返回false,则直接返回 调用HandlerAdapter对象的handler得到ModelAndView对象 应用拦截器的postHandle方法 调用processDispatchResult对结果进行处理,其内部调用了拦截器的afterCompletion方法

Netty之ChannelHandler

Channel的生命周期Channel包含4个状态: ChannelUnregistered Channel已经被创建,但还未注册到EventLoop ChannelRegistered Channel已经被注册到EventLoop ChannelActive Channel处于活动状态,它现在可以接受和发送数据了 ChannelInactive Channel没有连接到远程节点

负载均衡的实现方式与算法

负载均衡的实现方式HTTP重定向负载均衡 HTTP重定向负载均衡需要一台重定向服务器。它的功能就是根据用户的HTTP请求根据负载均衡算法选择一个真实的服务器地址,并将服务器地址信息写入到重定向响应中返回给用户浏览器。用户浏览器再获取到响应之后,根据返回的信息,重新发送一个请求到真实的服务器上。

Netty之ByteBuf

简介ByteBuf是Netty的数据容器,它解决了JDK API的局限性,能为网络应用程序的开发者提供更好的API支持。ByteBufAPI的优点如下: 它可以被用户自定义的缓冲区类型拓展 通过内置的复合缓冲区类型实现了透明的零拷贝。 容量可以按需增长 在读和写这两种模式下切换不需要调用BuyteBuffer的flip()方法 读和写使用了不同的索引 方式支持链式调用 支持引用计数 支持池化

Netty线程模型

Reactor线程模型Netty的线程模型实际上就是Reactor模型的一种实现。 Reactor模型是基于事件驱动开发的,核心组成部分是一个Reactor和一个线程池,其中Reactor负责监听和分配事件,线程池负责处理事件。根据Reactor的数量有线程池的数量,又可以将Reactor分为三种模型: 单线程模型(单Reactor,单线程) 多线程模型(单Reactor,多线程) 主从多线程模型(多Reactor,多线程)

段页式内存管理

内存管理需要解决的问题内存管理无非就是解决三个问题: 如何使进程的地址空间隔离 如果提高内存的使用效率 如何解决程序运行时的重定位问题 现在的内存管理方案就是引入虚拟内存这一中间层。虚拟内存位于程序和物理内存之间,程序只能看见虚拟内存,不能直接访问物理内存。每个程序都有自己独立的虚拟地址空间,这样就做到了进程地址空间的隔离。 引入了虚拟地址技术后,我们需要解决如何将虚拟地址映射到物理地址。这主要有分段和分页两种技术。

12315