力扣网-两数之和

力扣网-两数之和,第1张

力扣网-两数之和 体会

笔试题的回答与工作时的编程不同,笔试题讲究的是在有限的时间里完成快速完成核心问题,而工作中则可以进行不断的优化和迭代。但是,笔试题更加看重的是快速、正确,所以不用过多的追求优美,想要快速的解答问题,一方面是要有代码感,另外的就是熟练使用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 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 getArrayList(int[] nums) {
        return Arrays.stream(nums)
                .boxed()
                .collect(Collectors.toList());

    }
}
优化细节 从int[]转化为ArrayList

int数组转化成List简便的方法

Integer相等比较问题

自己在这里遇到的问题是在比较相等时,使用了Integer ==
在[-128, 127)是有效的,但是给出测试用例[2222222, 2222222],就无法通过了。

int findB(ArrayList 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 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 list, Integer b) {
        return list.lastIndexOf(b);
    }

这样,我们可以进一步的使用内联方法把findB的函数调用去掉,因为已经很简单了嘛。

总结

 今天是2022-01-28 18:00,外面下雨,已经进入了深夜,最近的情绪不好,有点难过,心情就像外面的天气一样,阴雨连绵的。自己还是要尽快调整一下,才能接着做自己要做的事情。
 还有就是下午根据老师的意见编写专利的时候,询问荣的时候,就觉得,优哉游哉,没有急迫性是做不好一件事情的,尽快完成才是最好的解决问题的方法吧,那种病态的从容,从自己身上,从别人身上都能看到。以后要紧迫性一点,加油。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5719753.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存