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