ARTS 第5周 -0603

  • Algorithm主要是为了编程训练和学习。每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard)。进行编程训练,如果不训练你看再多的算法书,你依然不会做算法题,看完书后,你需要训练。关于做Leetcode的的优势,你可以看一下我在coolshell上的文章 Leetcode 编程训练 - 酷 壳 - CoolShell。
  • Review:主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手。所以,需要你阅读并点评至少一篇英文技术文章,我个人最喜欢去的地方是http://Medium.com(需要梯子)以及各个公司的技术blog,如Netflix的。
  • Tip:主要是为了总结和归纳你在是常工作中所遇到的知识点。学习至少一个技术技巧。你在工作中遇到的问题,踩过的坑,学习的点滴知识。
  • Share:主要是为了建立你的影响力,能够输出价值观。分享一篇有观点和思考的技术文章

打卡地址

 

Algorithm 算法

最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

 

这道题,我是纠结了好久才动手,动手之后感觉不是很难,只是写出来的东西非常啰嗦。

自己的解法

    public static int maxSubArray(int[] nums) {
        int maxSub = 0; // 结果.
        Integer mininumNagativeNum = null; // 最小负数.
        Integer maxinumPositiveNum = null; // 最大正数.
        if (nums != null && nums.length > 0) {
            for (int i = 0; i < nums.length; i++) {
                // 获取元素.
                int num = nums[i];
                if (num <= 0) {
                    // 小于0.
                    if (mininumNagativeNum == null || num > mininumNagativeNum) {
                        // 设置最小负数.
                        mininumNagativeNum = num;
                    }
                    // 与maxSub比较,只判断maxSub大于0的情况.
                    if (maxSub > 0) {
                        int middleNum = maxSub + num;
                        if (middleNum > 0) {
                            maxSub = middleNum;
                        } else {
                            maxSub = 0;
                        }
                    }
                } else {
                    // 大于0.
                    if (maxinumPositiveNum == null || num > maxinumPositiveNum) {
                        // 设置最大正数.
                        maxinumPositiveNum = num;
                    }
                    if (maxSub >= 0) {
                        maxSub = maxSub + num;
                        if (maxSub > maxinumPositiveNum) {
                            maxinumPositiveNum = maxSub;
                        }
                    } else {
                        // maxSub 小于0.
                        maxSub = num;
                    }
                }
            }
            if (maxinumPositiveNum != null && maxinumPositiveNum > maxSub) {
                maxSub = maxinumPositiveNum;
            } else if (maxinumPositiveNum == null &&  mininumNagativeNum != null){
                maxSub = mininumNagativeNum;
            }
        }
        return maxSub;
    }

 

 

 

高赞解法

    public static int maxSubArray(int[] nums) {
        int sum = nums[0];
        int maxSum = nums[0];

        if (nums != null && nums.length > 0) {
            for (int i = 1; i < nums.length; i++) {
                // 获取元素.
                int num = nums[i];
                if (sum > 0) {
                    sum += num;
                } else {
                    sum = num;
                }
                maxSum = Math.max(maxSum, sum);
            }
        }
        return maxSum;
    }

分析

  1. 有一个值来存储最大sum值(与每一个num比较,与历史最大sum比较)
  2. 当sum小于零的时候,就可以重新计算sum了(负数 加上 num,只会比num更小)

 

 

Review 回顾

Alumni Q&A with SwitchUp: Biology Bachelor’s to Software Development

一个生物音乐双学位,半个音乐学硕士转行前端工程师。这两个专业并不是他喜欢的,想要为之付出的,但是软件开发工作却让他如鱼得水,有动力也有激情工作和学习。

 

Determined not to be left behind:决定不在落后

academic:学术的;学业的

aptitude:资质;天资;天赋

propensity:倾向;习性

dedication:奉献精神;献身;

give internal tech talks:进行内部技术讨论

I specialize in front-end development in javascript but also hop on projects that utilize a variety of backends including Node or Rails.

我专门从事JavaScript的前端开发,但也会跳上使用各种后端(包括Node或Rails)的项目。

admittedly:不可否认

beneficial:有益的

navigate:航海;导航;确定位置和方向;

is beneficial to navigate the path to a career in software development.

对确定软件开发事业的方向是有益的

motivated:激励;激发;成为…的动机;是…的原因;推动…甘愿苦干;

pursuing:追求;致力于;执行;贯彻;

fundamentals:基本原理

mentorship:指导

paramount:至为重要的;首要的;

Focus on the fundamentals and be more selective about the opportunities that you will get. There are a lot of software jobs out there, and making sure you find yourself at a place where you can continue to learn quickly and have good mentorship is paramount.

专注于基础技术的学习,这样在机会来临时才能有更多的选择。现在有很多的软件开发工作,确保你找到一个可以继续快速有效的学习,并且能得到良好指导的地方是最重要的。

 

 

 

 

Tip 知识点

异步处理的设计要点

异步处理可能会因为一些故障导致我们的一些任务没有被处理,比如消息丢失,没有通知到,或通知到了,没有处理。有这一系列的问题,异步通知的方式需要任务处理方处理完成后,给任务发起方回传状态,这样确保不会有漏掉的

 

另外,发起方也需要有个定时任务,把一些超时没有回传状态的任务再重新做一遍你可以认为这是异步系统中的"对账”功能。当然,如果要重做的话,就需要处理方支持幂等性处理

 

异步处理的整体业务事务问题,也就是说,异步处理在处理任务的时候,并不知道能否处理成功,于是就会一步一步地处理,如果到最后一步不能成功,那么你就需要回滚。这个时候,需要我们在弹力设计中说的补偿事务的流程。

 

并不是所有的业务都可以用异步的方式,比如一些需要强一致性的业务,使用异步的方式可能就不适合,这里需要我们小心地分析业务。我相信绝大多数的业务场景都用不到强一致性,包括银行业务。另外,在需要性能的时候,需要牺牲强一致性,变为最终一致性

 

在运维时,我们要监控任务队列里的任务积压情况。如果有任务积压了,要能做到快速地扩容。如果不能扩容,而且任务积压太多,可能会导致整个系统挂掉,那么就要开始对前端流星进行限流。

 

最后,还想强调一下,异步处理系统的本质是把被动的任务处理变成主动的任务处理,其本质是在对任务进行调度和统筹管理。

 
  

 

 

Share分享

 

上面的知识点就来自于与耗子叔的

 

59 | 性能设计篇之“异步处理”

 

你可能感兴趣的:(java,ARTS)