尝试从列表访问元素时,类似 Java 代码的行为存在差异

问题描述 投票:0回答:1

我试图解决编码问题https://www.hackerrank.com/challenges/minimum-distances/problem (给定一个列表,找到任意两个相等元素之间的最小距离)

编写了这段代码,但未通过一些测试。

public static int minimumDistances(List<Integer> a) {
        int min = Integer.MAX_VALUE; boolean hasPair = false;
        for(int i = 0 ; i < a.size()-1; i ++){
            for(int j = i+1; j < a.size() ; j++){
                if(a.get(i) == a.get(j) && j-i < min){
                    min = j-i;
                    hasPair = true;
                }
            }
        }
        if(!hasPair)
            min = -1;
        return min;
    }

}

但是,当在内循环之前将

a.get(i)
提取到变量中并在内循环中使用该变量时,测试用例就会通过。现在我无法理解有什么区别,是否在程序集级别上进行了任何优化以给出不同的结果?

此代码使所有测试都通过(我也能够在本地计算机中重现此代码)

public static int minimumDistances(List<Integer> a) {
        int min = Integer.MAX_VALUE; boolean hasPair = false;
        for(int i = 0 ; i < a.size()-1; i ++){
            int current = a.get(i);
            for(int j = i+1; j < a.size() ; j++){
                if(current == a.get(j) && j-i < min){
                    min = j-i;
                    hasPair = true;
                }
            }
        }
        if(!hasPair)
            min = -1;
        return min;
    }

}
java arraylist nested-loops
1个回答
0
投票

当你做

a.get(i) == a.get(j)
时,它会进行参考比较,这基本上说明它们是否是同一个对象。
但在第二种方法中,当您执行
current == a.get(j)
时,由于第一个参数是原始类型,因此第二个对象发生 auto unboxing ,导致两个原始数据之间进行比较,从而比较值。 这就是为什么第二个案例通过了所有案例。

现在,有一个问题。正如您可能已经看到的,在运行第一个代码时,它会为您的输入提供正确的答案。这是因为 -128 到 127 之间的整数具有相同的引用,因为 Java 会缓存这些特定的小范围值,并且无论使用这些值创建多少次新对象,都只使用单个对象。因此,当您使用此范围的输入检查第一个代码时,您的程序将运行得很好。
© www.soinside.com 2019 - 2024. All rights reserved.