我得到了一系列双打,所有数字都是相同的,除了一个。我的任务是找到唯一的号码。我的代码返回正确的输出,现在我想知道如何进一步优化它。
这是我的代码:
public static double findUnique(double array[]) {
double unique = 0;
double common = 0;
for(int i=0; i<array.length; i++) {
for(int j=i+1; j<array.length; j++) {
if(array[i]==array[j]) {
common = array[i];
}
}
if(common!=array[i]) {
unique = array[i];
}
}
return unique;
}
我唯一能想到的就是先存储数组的长度,但经过一些测试后实际需要的时间更长。感谢。
答案 0 :(得分:3)
public static double findUnique(double array[]) {
if(array.length < 3) {
throw new IllegalArgumentException("wrong array");
}
double common;
if(array[0] == array[1]) {
common = array[0];
} else {
return array[0] != array[2]? array[0]: array[1];
}
for(int i=2; i<array.length; i++) {
if(common != array[i]) {
return array[i];
}
}
throw new IllegalArgumentException("wrong array");
}
答案 1 :(得分:2)
我相信在everey迭代中抓住两个新数字是不可取的。
相反,我们可以先抓住数组中的两个第一个数字,然后如果这些数字相同,我们可以将其余数字与它们的值进行比较。所以我们在for循环之上定义我们的公共,这样我们将避免在每次迭代中包含:common = array [i]的for循环和if语句。我相信这应该会对速度产生影响,至少如果数组是疯狂的话。^^
另外,将返回放在for循环中,这样即使你真的找到了那块黄金:) :)你也不会迭代整个列表。 (返回一些东西总会破坏整个方法。)
希望我不要错过任何理解:)。这里有一些代码供你使用。 :)
$urlRouterProvider.otherwise
答案 2 :(得分:0)
如果先对整个数组进行排序,该怎么办?然后只看一下数组的前两个和最后一个元素。