Dimple在左耳听风ARTS打卡(十一)

 
 

今天是端午节,也是高考的日子。小编当年是过了端午节高考的,今年也是赶上了,凑到了一起。你们家里人有要高考的吗?小编祝福他们。同时也祝各位端午节快乐!

所谓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的网络框架,目标是提供一种简单、快速构建网络应用的方式,同时保证高吞吐量、低延时、高可靠性。

考点:

  1. Reactor模式和Netty线程模型

  2. Pipelining、EventLoop 等部分的设计实现细节

  3. Netty的内存管理机制、引用计数等特别手段

  4. 有的时候面试官也喜欢对比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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小跃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值