All
二叉树的锯齿形层次遍历-LeetCode103
2020 年 03 月 31 日
题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如: 给定二叉树 [3,9,20,null,null,15,7],
3 / \ 9 20 / \ 15 7 返回锯齿形层次遍历如下:
\[ \[3], \[20,9], \[15,7] ] 所谓的锯齿形遍历,即是在第一层从左向右遍历,在第二层从右向左遍历,依次遍历完成。
多数元素-LeetCode169
2020 年 03 月 29 日
题目描述 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3] 输出: 3 示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
盛水最多的容器—LeetCode11
2020 年 03 月 26 日
题目描述 给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入:[1,8,6,2,5,4,8,3,7] 输出:49
自己动手实现一个RPC框架(二)
2020 年 03 月 25 日
自己动手实现一个RPC框架
使用fastjson,netty,反射,动态代理,zookeeper实现一个RPC框架。
代码链接:https://github.com/liunaijie/self-rpc-framwork`
各模块说明: rpc-commons 通用设置模块,包括网络传输的数据格式,请求编号工具类,反射工具类等一些底层协议,工具相关的内容
rpc-register
服务注册模块,主要包括服务的注册与发现功能。这里使用zookeeper来进行实现。
在这里,服务端注册时,使用通用模块中的ServiceDescriptor,ResponseServiceDescription类来进行注册 ResponseServiceDescription类是ServiceDescription的子类,添加了实现类,实例地址等属性。 消费者查找服务时,发送ServiceDescription得到ResponseServiceDescription,一个类可能有多个实现类,多个实例,在返回时进行随机返回。 对于同一个实现的不同版本实现,或多个服务实例这种情况随机返回没有问题。对于不同实现类,采用随机返回可能有些问题,但是在spring中对于多实现类也需要指定实现类,所以后面再考虑更改。
自己动手实现一个RPC框架(六)
2020 年 03 月 25 日
rpc-server 消费者的部分,这里使用配置类,将各种实现的部分在配置类中进行定义。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class ServerConfig { /** * 监听端口 */ private int port = 9090; /** * 网络传输 */ private Class<? extends TransportServer> transportClass = NettyServer.class; /** * 注册中心 */ private Class<? extends RpcRegister> rpcRegister = ZookeeperRegistry.class; /** * 编码 */ private Class<? extends Encoder> encoder = FastJsonEncoder.class; /** * 解码 */ private Class<? extends Decoder> decoder = FastJsonDecoder.class; } 这这个配置中,定义了服务启动的端口,网络传输,注册中心,编解码的各种实现,当我们需要更换实现时只需要在这里修改即可。
自己动手实现一个RPC框架(七)
2020 年 03 月 25 日
rpc-client 消费者端,通过代理来进行调用。
与生产者端类型,首先定义配置类:
1 2 3 4 5 6 7 8 9 10 public class ClientConfig { private Class<? extends Encoder> encoder = FastJsonEncoder.class; private Class<? extends Decoder> decoder = FastJsonDecoder.class; private Class<? extends TransportClient> transportClient = NettyClient.class; private Class<? extends RpcRegister> rpcRegister = ZookeeperRegistry.class; }
自己动手实现一个RPC框架(三)
2020 年 03 月 25 日
rpc-commons 这个模块主要是定义一些通信协议类,工具类。
自己动手实现一个RPC框架(四)
2020 年 03 月 25 日
rpc-register 注册中心,这里使用zookeeper来实现。
生产者在启动服务时,将自己实现的服务注册到注册中心。
消费者调用服务时,来注册中心查找,返回调用服务实例的地址信息。
并且为了适应不同的注册实现,我们将功能定义为接口,在替换实现时在配置文件中进行替换即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public interface RpcRegister { /** * 注册服务 * @param serviceDescriptor * @param responseServiceDescription */ void register(ServiceDescriptor serviceDescriptor, ResponseServiceDescription responseServiceDescription); /** * 根据服务名称查询实例地址 * @param serviceDescriptor * @return */ ResponseServiceDescription lookup(ServiceDescriptor serviceDescriptor); }
自己动手实现一个RPC框架(五)
2020 年 03 月 25 日
rpc-transport 这个模块是有在观看消息队列高手课中的rpc示例完成的。
网络传输模块,这里使用netty来进行实现。
生产者调用来指定端口启动服务。
1 2 3 4 public interface TransportServer { void start(int port) throws InterruptedException; void stop(); }
有序链表转换为二叉搜索树—LeetCode109
2020 年 03 月 21 日
题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0 -3 9 -10 5 答案不唯一,只要满足平常二叉树的特性即可。
题目中给出的数组已经按升序排序,我们需要将其转换为平衡二叉树。