今天是端午节,也是高考的日子。小编当年是过了端午节高考的,今年也是赶上了,凑到了一起。你们家里人有要高考的吗?小编祝福他们。同时也祝各位端午节快乐!
所谓ARTS: 每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第十一期打卡。
这个ARTS打卡真的很赞,这几周因为没有提前准备,所以总是有一颗石子在心头挥之不去,生怕忘记打卡啥的。所以,还是坚持每天去寻找素材,搜集素材,只为能坚持下去,对得起自己的内心。
虽然有些时候,确实写的不咋滴,但是还是经过努力付出的,也算是给自己的交代。十一期了,继续努力前进。
Algorithm LeetCode算法
搜索插入位置
(https://leetcode-cn.com/problems/search-insert-position/)
题目描述:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5输出: 23,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2输出: 13,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7输出: 43,5,6], 7
输出: 4
示例 3:
输入: [1,3,5,6], 0输出: 03,5,6], 0
输出: 0
这题就是告诉大家怎么查找一个数字,而且是依次从大到小的查找,所以,你知道你怎么做了吗?
如果你想到了循环遍历,说明你热衷于基础知识的构建,对于性能没啥追求。所以,还有更好的办法不?LeetCode不就是在帮助我们找更好的解决办法吗?查找的算法,有好几个,对吧。这里,自然用的就是二分法查找来的更省力,相比于循环遍历,查找的次数自然就少了很多,性能也就提升上去啦。
可能对数据少的,是体会不出来的,所以当你提交答案的时候,会发现时间和内存消耗都不大,但是,如果你用了大数据量,那差距自然就会体现出来了,不信你试试。
/** * * @Title: searchInsert * @Description: 通过遍历 * @param nums * @param target * @return int * @throws */public static int searchInsert(int[] nums, int target) { if (nums == null || nums.length == 0) { return 0; } int length = nums.length; if (nums[0] == target) { return 0; } if (nums[length - 1] == target) { return length - 1; } for (int i = 0; i < length; i++) { if (nums[i] >= target) { return i; } } return length;}
public static int searchInsert(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return 0;
}
int length = nums.length;
if (nums[0] == target) {
return 0;
}
if (nums[length - 1] == target) {
return length - 1;
}
for (int i = 0; i < length; i++) {
if (nums[i] >= target) {
return i;
}
}
return length;
}
/** * * @Title: searchInsert1 * @Description: 通过二分法 * @param nums * @param target * @return int * @throws */public static int searchInsert1(int[] nums, int target) { if (nums == null || nums.length == 0) { return 0; } int length = nums.length; int low = 0; int high = length - 1; if (nums[low] == target) { return 0; } if (nums[high] == target) { return high; } int mid = (low + high) / 2; while (low <= high) { if (nums[mid] == target) { return mid; } if (nums[mid] < target) { low = mid + 1; mid = (low + high) / 2; } else { high = mid - 1; mid = (low + high) / 2; } } return low;}
public static int searchInsert1(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return 0;
}
int length = nums.length;
int low = 0;
int high = length - 1;
if (nums[low] == target) {
return 0;
}
if (nums[high] == target) {
return high;
}
int mid = (low + high) / 2;
while (low <= high) {
if (nums[mid] == target) {
return mid;
}
if (nums[mid] < target) {
low = mid + 1;
mid = (low + high) / 2;
} else {
high = mid - 1;
mid = (low + high) / 2;
}
}
return low;
}
Review 阅读并点评至少一篇英文文章
Spring Cloud Consul
(https://cloud.spring.io/spring-cloud-static/spring-cloud-consul/2.1.0.RELEASE/single/spring-cloud-consul.html#_how_to_activate)
今天这个,看标题想必大家都已经知道,这是微服务中的注册中心。因为eureka在2.x版本之后停止更新了,小编最近又在学习微服务。把eureka学会了,但是还是想挑战下这个consul,毕竟小编的项目是新项目,可以做各种尝试,而不怕。
但是因为consul资料不多,所以很多时候,需要自己寻找资料。这篇文中的consul就描述的挺好的,而且基本上我也能看懂,适合大部分开发人员掌握。consul在微服务中的地位会越来越高,随着像我这种新人的加入,以及后续的发展来说,掌握这个技能是刻不容缓
想学习微服务的可以了解下哦。最近入了微服务的坑,真的是酸爽,把我所有的休息时间都占据了,但能学到快乐,这才是最重要的。小编当初可以很抗拒学技术,现在不一样了,当乐趣在写程序,心态不同,角度就不同,写程序的你,体会到了吗?如果你还没转换这个角色,那请你赶紧转换过来,愉快的编程才是最好的方式。
Tip 一个技术技巧
继续分享《Java核心技术36讲》做的学习笔记,对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?这篇是《Java核心技术36讲》的最后一篇分享了,后面还有两个,个人觉得适合自行消化,所以就不分享啦。我们回头换一个技术栈。
典型回答
单独从性能角度,Netty在基础的NIO等类库之上进行了很多改进,例如:
知识扩展
按照官方定义,它是一个异步的、基于时间Client/Server的网络框架,目标是提供一种简单、快速构建网络应用的方式,同时保证高吞吐量、低延时、高可靠性。
考点:
Reactor模式和Netty线程模型
Pipelining、EventLoop 等部分的设计实现细节
Netty的内存管理机制、引用计数等特别手段
有的时候面试官也喜欢对比Java标准NIO API,例如,你是否知道Java NIO早期版本中的Epoll空转问题,以及Netty的解决方式等。
Netty的线程模型是什么样的?
Netty采用Reactor线程模型。这里面主要有三种Reactor线程模型。分别是单线程模式、主从Reactor模式、多Reactor线程模式。其都可以通过初试和EventLoopGroup进行设置。其主要区别在于,单Reactor模式就是一个线程,既进程处理连接,也处理IO。类似于我们传统的OIO编程。主从Reactor模式,其实就是将监听连接和处理IO的分开在不同的线程完成。最后,主从Reactor线程模型,为了解决多Reactor模型下单一线程性能不足的问题。改为了一组线程池进行处理。官方默认的是采用这种主从Reactor模型。其线程数默认为CPU内核的2倍。
Share 一篇有观点和思考的技术文章
这次还是沉浸在设计模式的世界中,继续前行了。
公众号地址:
设计模式之工厂模式(一)
爱生活,爱学习,爱感悟,爱挨踢
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/a04b24d5c5ab04b5a802597a14d02a3b.jpeg)