力扣网-两数之和

体会

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

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

在这里插入图片描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值