ARTS 第二周分享
每周完成一个ARTS(也就是 Algorithm、Review、Tip、Share 简称ARTS):
- 每周至少做一个 leetcode 的算法题
- 阅读并点评至少一篇英文技术文章
- 学习至少一个技术技巧
- 分享一篇有观点和思考的技术文章。
Algorithm
LeetCode 905. Sort Array By Parity
Given an array A of non-negative integers, return an array consisting of all the even elements of A, followed by all the odd elements of A.
You may return any answer array that satisfies this condition.
Input: [3,1,2,4]
Output: [2,4,3,1]
The outputs [4,2,3,1], [2,4,1,3], and [4,2,1,3] would also be accepted.
题意:偶数放在数组前部,奇数放在数组后部。
思路:双指针法:两个指针分别指向奇、偶数,适时移动即可。
易错点:注意数组下标越界问题。
以下解法:时间复杂度O(n2)(最差),空间复杂度O(1)。
1 | class Solution { |
扩展:可以尝试模仿快排的方式解题,应该会更容易,不过同时容易造成不稳定的情况。
LeetCode 129. Sum Root to Leaf Numbers
Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.
An example is the root-to-leaf path 1->2->3 which represents the number 123.
Find the total sum of all root-to-leaf numbers.
Input: [1,2,3]
1
/
2 3
Output: 25
题意:从根节点到叶子节点数字组成一个 number,所有 number 的和输出。
思路:DFS 的思路,如下:
1 | /** |
Review
本周阅读英文文章来自 javaworld ,名为:Thread behavior in the JVM
- 首先提到“new、runnable、running、suspended、blocked、terminated”Java 线程的六种状态。
- 然后重点提及了继承 thread 类和实现 Runnable 接口两种实现多线程的方式。
- 将线程分为:守护线程与非守护线程:
- 非守护线程:会一直执行到任务结束,除非出现
System.exit()
的情况。 - 守护线程:无需执行到任务最后。如果其他非守护线程都已经结束了,那么此守护线程也会立即结束。
- 非守护线程:会一直执行到任务结束,除非出现
1 | /** |
笔者本机模拟截图如下:
main 线程 end 后,daemon 线程最终到470左右也发生 end,并未完成打印到 100000 的任务。
线程有 1~10 的优先级的说法,从低到高,但是并不能保证完全依据优先级先后执行。
Remember, we can’t rely on program logic (order of threads or thread priority) to predict the JVM’s order of execution.
Java threads 容易出现的错误:
- 在 run 方法中开启新线程;
- 同一个线程 start 两次;
- 多的线程同时改变一个对象的状态;
- 依赖线程优先级来实现逻辑;
- 依赖线程 start 的先后顺序来实现逻辑。
Tip
- 中英文混写的文章中,为了美观考虑,可以尽量在中英文中间加上空格,这里采用搜狗输入法的相关设置,默认为中文间加上空间,省心省事。
- idea 编辑器中,双击 SHIFT 键,可以调出全局搜索,可以搜索 JDK 中的相关类。
- lombok 插件尤其有用,可以节省很多 setter/getter 的格外设置。
Share
本周分享我用 Java 代码完成的:七种内部排序的代码实现
That’s all,thank you!