ARTS是什么?
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Techni:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章。
Algorithm
题目:两数之和
解题思路
这道题还是比较简单的,最直观的思路就是依次拿数组中的数和位于它后面的数相加,如果相加结果等于目标数的话就找到了我们所要找的两个数了,返回由这两个数的索引组成的数组就是本题的解。但是这种方法的效率不太高,时间复杂度为O(n2),我们还可以考虑效率更高的其他方法。
上面提到的方法效率低是因为我们用来比较的两个数是通过遍历两次数组获取的,那么有没有更快的方法来获取需要比较的数呢,答案是肯定的,哈希表,获取某个数的时间复杂度近乎为O(1),那么我们可以遍历数组里的数一个个放到一个hashmap里,且在放入每个数前先去查找一下当前hashmap里是否存在目标数,如果存在就得到了解,不存在则放入hashmap,这样只需要遍历一次数组,时间复杂度为O(n),大大提高了效率。
代码
第一种方法我们采用两次循环遍历数组,时间复杂度为O(n2)
class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i=0; i<nums.length; i++){
for (int j=i+1; j<nums.length; j++){
if(nums[i] + nums[j] == target){
return new int[]{i,j};
}
}
}
throw new RuntimeException("数据异常");
}
}
第二种方法我们只需遍历一次数组,并运用了hashmap,时间复杂度为O(n)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++){
int requiredNum = target - nums[i];
if (map.containsKey(requiredNum)){
return new int[]{i,map.get(requiredNum)};
}
map.put(nums[i], i);
}
throw new RuntimeException("数据异常");
}
}
Review
分享一篇写Java 8 Lambda表达式的文章How to start working with Lambda Expressions in Java,作者在文中介绍了java中使用Lambda表达式的基本入门知识,首先介绍了Lambda表达式是利用了多核环境的并发能力,然后从函数式接口、箭头操作符、块状Lambda表达式、泛型函数式接口、用Lambda表达式作为参数等方面详细介绍了Lambda表达式的使用方法,对于了解和使用Lambda表达式非常有帮助。
Tip/Techni
本周项目里遇到一个接口返回比较慢的问题,需要优化调用时长,这时候就想知道接口里具体的哪几个子方法调用时间比较长,对于这个问题想起了之前了解过的一个工具arthas,它是阿里开源的一个Java诊断工具,方便定位各种线上问题,比如我的这个问题可以使用它的一个命令trace来解决,trace命令会显示当前方法下一层子方法的调用时长,然后可以根据子方法再使用trace命令查看下一层子方法的调用时长,一直循环下去直到我们需要优化的那个方法。除了这个命令外还有很多其他很强大的功能等待你去发现。
Share
今天分享一篇文章How to Become a Better Software Developer,作者在文中通过多个方面完整地讲述了如何成为一个更好的软件开发者,如果你想变得更好,不妨读一读这篇文章,并践行文中的方法,相信会有很大的收货。