我试图解决编码问题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;
}
}
当你做
a.get(i) == a.get(j)
时,它会进行参考比较,这基本上说明它们是否是同一个对象。current == a.get(j)
时,由于第一个参数是原始类型,因此第二个对象发生 auto unboxing ,导致两个原始数据之间进行比较,从而比较值。 这就是为什么第二个案例通过了所有案例。