所谓ARTS: 每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第十二期打卡。

今天早上更新版本,出现了小插曲,让自己惊出一身冷汗。没想到看到了一篇deadlines的文章,让我好像知道了点什么,也把小插曲的事情忘记了。或许,这就是技术的魅力所在吧。

Algorithm LeetCode算法

最大子序和

(https://leetcode-cn.com/problems/maximum-subarray/)

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

示例 1:

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

算法题,就是考察你对算法的熟悉程度,然鹅,小编因为没怎么熟悉,所以经常使用不是很厉害的算法来解题,好尴尬的。

今天这个,小编的第一反应自然就是用循环解法,没想到做完了,才发现,这个叫动态递归,哈哈。其实就是以连续数组结束位置为每一步的解,sum其实就是记录了上一步骤的解,在这个步骤上进行对比,如果上一步的解小于0,那自然就舍弃了。得到当前步骤的解,与之前步骤解的最大值result进行比较,自然就知道答案了。

public static int maxSubArray(int[] nums) {
int sum = 0;
int result = nums[0];
for (int i : nums) {
sum = sum > 0 ? sum + i : i;
if (result < sum) {
result = sum;
}
}
return result;
}

当然啦,这题提示还有一个解法是通过分治法解决的,思路就是通过递归分治不断的缩小规模,问题结果就有三种,左边的解,右边的解,中间的解,得到三个解通过比较大小即可。思路给你啦,因为也不是小编的解答,所以,这里,你自己去试试看吧。

Review 阅读并点评至少一篇英文文章

How to make peace with deadlines in software development

(https://medium.com/free-code-camp/how-to-make-peace-with-deadlines-in-software-development-6cfe3e993f51)

说来也巧,今天通过朋友的努力,让我出去呼吸了下新鲜空气,正好碰到打卡的日子,顺带去看一篇文章。这篇又是标题吸引了我,在我们软件开发的过程中,经常会有各种deadlines,前段时间还因为这个deadlines没确定好的问题,引起了一些不必要的麻烦,在这里就不详细赘述了。

那么如何很好的确定一个deadlines呢?在文中给出了以下11点,为了让我的翻译不迷惑大家,我在这里就把标题给出来了,感兴趣的朋友可以参考原文哦。这里的11点,是作者做的精华总结,真的很赞,值得大家好好品味。


  1. Work in a calm environment
  2. Our estimates suck
  3. Good enough is fine
  4. Don’t be too optimistic. Be realistic
  5. Differentiate between “you have to do”, “you could do” and “you want to do”
  6. Say no by default
  7. Never change the deadline
  8. Be aware that there will be always some problems
  9. Don’t add more people to a project
  10. Don’t procrastinate
  11. Communicate: See where is the bottleneck?

一个好的deadlines的建立,不仅仅需要各方面的能力,还得是自己有能力来做判断。比如第4点,如果技术不够,认清不了现实,那肯定是很难制定出来了。

还有最后一条,一个项目的完成,肯定是一个团队努力的结果。所以,沟通是最最重要的,良好的沟通胜过很多无用功。当然啦,沟通也是有技巧的,怎么做,还得从实际情况实际出发来说,这里小编暂时也没有给出太多的意见来了那就。

Tip 一个技术技巧

Java的技术栈,到上一次为止,先结束了。今天和下次,我将给大家分享下Android的存储优化相关。这是第一篇。

“将特定结构的数据转化为另一种能被记录和还原的格式”

数据存储六个关键要素:正确性、时间开销、空间开销、安全、开发成本和兼容性。

我们今天主要来讲讲Android常用的序列化方法如何进行选择。

对象的序列化

  1. Serializable
    Serializable的注意事项

  • 不被序列化的字段。类的static变量以及被声明为transient的字段,默认的序列化机制都会忽略该字段,不会进行序列化存储。当然我们也可以使用进阶的writeReplace和readResolve方法做自定义的序列化存储
  • serialVersionUID。这个ID我们可以显示声明也可以让编译器自己计算。​通常我建议显示声明更加稳妥​。因为隐式声明假如类发生了一点点变化,进行反序列化都会由于serialVersionUID改变而导致InvalidClassException异常
  • 构造方法。

  1. Parcelable

    核心作用就是为了解决Android中大量跨进程通信的性能问题。

Parcel序列化和Java的Serializable序列化差别还是比较大的,Parcelable只会在内存中进行序列化操作,并不会将数据存储到磁盘里。

**Parcelable的注意事项**

  • 系统版本的兼容性
  • 数据前后兼容性
    一般来说,如果需要持久化存储的话,一般还是不得不选择性能更差的Serializable方案

  1. Serial

事实上,关于序列化基本每个大公司都会自己自研的一套方案,我在专栏里推荐Twitter开源的高性能序列化方案Serial。

从数据上来看,Serial在序列化与反序列化耗时,以及落地的文件大小都有很大的优势

从实现原理看,Serial就像是吧Parcelable和Serializable的优点集合在一起的方案

数据的序列化


  1. JSON

  2. Protocol Buffers
    如果应用的数据量非常大,又或者对性能有更高的要求,此时Protocol Buffers是一个非常好的选择



  • 性能。使用了二进制编码压缩,相比JSON体积更小,编码速度也更快
  • 兼容性。跨言语和前后兼容性都不错,也支持基本类型的自动转换,但是不支持继承与引用类型
  • 使用成本。Protocol Buffers的开发成本很高,需要定义.proto文件,并用工具生成对应的辅助类

存储监控


  1. 性能监控
    六大要素,更关注正确性、时间开销、空间开销

  2. ROM监控


爱生活,爱学习,爱感悟,爱挨踢Dimple在左耳听风ARTS打卡(十二)_序列化