所谓ARTS: 每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第十二期打卡。
今天早上更新版本,出现了小插曲,让自己惊出一身冷汗。没想到看到了一篇deadlines的文章,让我好像知道了点什么,也把小插曲的事情忘记了。或许,这就是技术的魅力所在吧。
Algorithm LeetCode算法
最大子序和 (https://leetcode-cn.com/problems/maximum-subarray/)
题目描述:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
代码语言:javascript复制输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
算法题,就是考察你对算法的熟悉程度,然鹅,小编因为没怎么熟悉,所以经常使用不是很厉害的算法来解题,好尴尬的。
今天这个,小编的第一反应自然就是用循环解法,没想到做完了,才发现,这个叫动态递归,哈哈。其实就是以连续数组结束位置为每一步的解,sum其实就是记录了上一步骤的解,在这个步骤上进行对比,如果上一步的解小于0,那自然就舍弃了。得到当前步骤的解,与之前步骤解的最大值result进行比较,自然就知道答案了。
代码语言:javascript复制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点,是作者做的精华总结,真的很赞,值得大家好好品味。
- Work in a calm environment
- Our estimates suck
- Good enough is fine
- Don’t be too optimistic. Be realistic
- Differentiate between “you have to do”, “you could do” and “you want to do”
- Say no by default
- Never change the deadline
- Be aware that there will be always some problems
- Don’t add more people to a project
- Don’t procrastinate
- Communicate: See where is the bottleneck?
一个好的deadlines的建立,不仅仅需要各方面的能力,还得是自己有能力来做判断。比如第4点,如果技术不够,认清不了现实,那肯定是很难制定出来了。
还有最后一条,一个项目的完成,肯定是一个团队努力的结果。所以,沟通是最最重要的,良好的沟通胜过很多无用功。当然啦,沟通也是有技巧的,怎么做,还得从实际情况实际出发来说,这里小编暂时也没有给出太多的意见来了那就。
Tip 一个技术技巧
Java的技术栈,到上一次为止,先结束了。今天和下次,我将给大家分享下Android的存储优化相关。这是第一篇。
“将特定结构的数据转化为另一种能被记录和还原的格式”
数据存储六个关键要素:正确性、时间开销、空间开销、安全、开发成本和兼容性。
我们今天主要来讲讲Android常用的序列化方法如何进行选择。
对象的序列化
- Serializable Serializable的注意事项
- 不被序列化的字段。类的static变量以及被声明为transient的字段,默认的序列化机制都会忽略该字段,不会进行序列化存储。当然我们也可以使用进阶的writeReplace和readResolve方法做自定义的序列化存储
- serialVersionUID。这个ID我们可以显示声明也可以让编译器自己计算。通常我建议显示声明更加稳妥。因为隐式声明假如类发生了一点点变化,进行反序列化都会由于serialVersionUID改变而导致InvalidClassException异常
- 构造方法。
- Parcelable 核心作用就是为了解决Android中大量跨进程通信的性能问题。
Parcel序列化和Java的Serializable序列化差别还是比较大的,Parcelable只会在内存中进行序列化操作,并不会将数据存储到磁盘里。
代码语言:javascript复制**Parcelable的注意事项**
- 系统版本的兼容性
- 数据前后兼容性 一般来说,如果需要持久化存储的话,一般还是不得不选择性能更差的Serializable方案
- Serial
事实上,关于序列化基本每个大公司都会自己自研的一套方案,我在专栏里推荐Twitter开源的高性能序列化方案Serial。
从数据上来看,Serial在序列化与反序列化耗时,以及落地的文件大小都有很大的优势
从实现原理看,Serial就像是吧Parcelable和Serializable的优点集合在一起的方案
数据的序列化
- JSON
- Protocol Buffers 如果应用的数据量非常大,又或者对性能有更高的要求,此时Protocol Buffers是一个非常好的选择
- 性能。使用了二进制编码压缩,相比JSON体积更小,编码速度也更快
- 兼容性。跨言语和前后兼容性都不错,也支持基本类型的自动转换,但是不支持继承与引用类型
- 使用成本。Protocol Buffers的开发成本很高,需要定义.proto文件,并用工具生成对应的辅助类
存储监控
- 性能监控 六大要素,更关注正确性、时间开销、空间开销
- ROM监控
Share 一篇有观点和思考的技术文章
这周还是继续在设计模式的世界里前行中。
公众号地址: 设计模式之工厂模式(二) 爱生活,爱学习,爱感悟,爱挨踢