ARTS第四周

ARTS是什么?

Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Techni:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章。

Algorithm

题目:买卖股票的最佳时机 III

解题思路

这道题目有个很重要的限制条件是“最多可以完成两笔交易”,有一种思路是常规的动态规划的思路,另外一种就是贪心算法的思路,我们想要获取最大的利润,就要每次操作都尽量把利润最大化,因为题目限制最多可以两次交易,所以实际上我们可以分成四次操作,分别是:第一次买入,第一次卖出,第二次买入,第二次卖出,假设初始状态我们所拥有的钱为0,最终就是想让我们在第二次卖出后拥有的钱最大化。

代码

    public static int maxProfit(int[] prices) {
        int firstBuy = Integer.MIN_VALUE, firstSell = 0;
        int secondBuy = Integer.MIN_VALUE, secondSell = 0;
        for (int curPrice : prices) {
            if (firstBuy < -curPrice) {
                firstBuy = -curPrice;
            }
            if (firstSell < firstBuy + curPrice) {
                firstSell = firstBuy + curPrice;
            }
            if (secondBuy < firstSell - curPrice) {
                secondBuy = firstSell - curPrice;
            }
            if (secondSell < secondBuy + curPrice) {
                secondSell = secondBuy + curPrice;
            }
        }
        return secondSell;
    }

Review

自从写ARTS以来,开始重新关注算法,发现了Medium上一篇用python写的五种排序算法,文章地址:https://medium.com/@george.seif94/a-tour-of-the-top-5-sorting-algorithms-with-python-code-43ea9aa02889,这篇文章的一个亮点是用动态图展示了每个排序算法的运行过程,阅读起来十分简单易懂。

文中分别讲述了冒泡排序、选择排序、插入排序、归并排序、快速排序五种排序算法的实现方法并附上了对应的Python代码。因为本人的主语言是java,看这篇文章的时候顺便熟悉了一下python语法,有的特性是Java没有的,比如两个值之间的交换,python可以很方便的一句代码搞定,而Java就不行了,python代码如下:

arr[i], arr[j] = arr[j], arr[i]

Tip

这周在写代码的时候想获取某一天的起始时间,也就是0点0分0秒和23点59分59秒两个时间点,用Java8以后的实现代码如下:

获取今天的起始时间(2018-12-09T00:00):

LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN)

获取今天的结束时间(2018-12-09T23:59:59.999999999):

LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);

Share

本周分享一篇探讨思维方式的文章How to think like a software developer
,名字翻译过来就是“如何像软件开发人员一样思考”,我摘取了几句话和大家分享,这几句话是我觉得写的比较好的,或者是我感同身受的,一共列了4句,为了保留原汁原味的感觉,我就不拿出我的蹩脚的翻译了_,大家自己阅读自己体会就好。

1.Learning something new is a delicate dance between consuming information and trying stuff out for yourself.

2.reading about writing does make you a better writer, but only if you put in the time writing.

3.The challenge is to balance both avenues of self-education: active information consumption and learning via trial and error.

4.One of my favorite ways to learn patterns is to read biographies of people who are successful in their respective fields.

相信读完这篇文章,每个人会有不同的体会,在我看来,对于软件开发人员很重要的一点就是:学练结合,学习知识方法,并且实践内化。

posted @ 2018-12-09 22:29  陈海翔  阅读(169)  评论(0编辑  收藏  举报