笔试题的回答与工作时的编程不同,笔试题讲究的是在有限的时间里完成快速完成核心问题,而工作中则可以进行不断的优化和迭代。但是,笔试题更加看重的是快速、正确,所以不用过多的追求优美,想要快速的解答问题,一方面是要有代码感,另外的就是熟练使用Java提供的类库,比如说Collections、TreeMap、Arrays、排序、查找等工具类。
这个题目,笔者最大的收获就是
indexOf和lastIndexOf的使用了。int[]转化为List
各位读者,2022年春节就要来了,希望每个人在这一年都能够心想事成,干干净净的迎接焕然一新的虎年。
问题简介 代码实现 第一个版本class Solution { public int[] twoSum(int[] nums, int target) { ArrayList第二个版本arrayList = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { arrayList.add(nums[i]); } final int[] result = new int[2]; for (int i = 0; i < arrayList.size(); i++) { Integer a = arrayList.get(i); Integer b = target - a; if (!arrayList.contains(b)) { continue; } if (i == findB(arrayList, b)) { continue; } result[0] = i; result[1] = findB(arrayList, b); return result; } return result; } int findB(ArrayList arrayList, Integer b) { for (int i = arrayList.size() - 1; i >= 0; i--) { if (b.equals(arrayList.get(i))) { return i; } } return -1; } }
public int[] twoSum(int[] nums, int target) { List第三个版本arrayList = getArrayList(nums); final int[] result = new int[2]; for (int i = 0; i < arrayList.size(); i++) { Integer a = arrayList.get(i); Integer b = target - a; if (!arrayList.contains(b) || i == arrayList.lastIndexOf(b)) { continue; } result[0] = i; result[1] = arrayList.lastIndexOf(b); return result; } return result; } private List getArrayList(int[] nums) { return Arrays.stream(nums) .boxed() .collect(Collectors.toList()); }
利用了lastIndexOf的返回值是否为-1来判断是否包含。
class Solution { public int[] twoSum(int[] nums, int target) { List优化细节 从int[]转化为ArrayListarrayList = getArrayList(nums); final int[] result = new int[2]; for (int i = 0; i < arrayList.size(); i++) { Integer a = arrayList.get(i); int b = target - a; int bIndex = arrayList.lastIndexOf(b); if (bIndex == -1 || i == bIndex) { continue; } result[0] = i; result[1] = bIndex; return result; } return result; } private List getArrayList(int[] nums) { return Arrays.stream(nums) .boxed() .collect(Collectors.toList()); } }
int数组转化成List简便的方法
Integer相等比较问题自己在这里遇到的问题是在比较相等时,使用了Integer ==
在[-128, 127)是有效的,但是给出测试用例[2222222, 2222222],就无法通过了。
int findB(ArrayListarrayList, Integer b) { for (int i = arrayList.size() - 1; i >= 0; i--) { if (b == arrayList.get(i)) { return i; } } return -1; }
具体分析参见
Integer比较相等的问题
以后Integer的相等,还是直接使用equals比较好。
在List中根据元素获取下标的方式有三种
自己实现遍历调用list.indexOf(Object), list.lastIndexOf(Object)
很明显优雅的方法是使用indexOf(Object)或者lastIndexOf可以使用lastIndexOf和indexOf的返回值来判断是否包含
int findB(ArrayListarrayList, Integer b) { for (int i = arrayList.size() - 1; i >= 0; i--) { if (b.equals(arrayList.get(i))) { return i; } } return -1; }
可以替换算法为
int findB(Listlist, Integer b) { return list.lastIndexOf(b); }
这样,我们可以进一步的使用内联方法把findB的函数调用去掉,因为已经很简单了嘛。
总结 今天是2022-01-28 18:00,外面下雨,已经进入了深夜,最近的情绪不好,有点难过,心情就像外面的天气一样,阴雨连绵的。自己还是要尽快调整一下,才能接着做自己要做的事情。
还有就是下午根据老师的意见编写专利的时候,询问荣的时候,就觉得,优哉游哉,没有急迫性是做不好一件事情的,尽快完成才是最好的解决问题的方法吧,那种病态的从容,从自己身上,从别人身上都能看到。以后要紧迫性一点,加油。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)