[英]loop over array, find largest number and see if all other numbers equal it in javascript
我有一个要遍历的数组,找到最大数,然后取数组中所有其他数的总和,看它是否等于最大数。 我使用两个for循环来完成此操作。 我试图弄清楚如何仅用一个循环就可以做到,而我似乎无法弄清楚。 请给我一些建议。
var myArray = [4, 6, 24, 10, 1, 3];
var arrayAddition = function (arr) {
var largestNumber = arr[0];
var sumTotal = 0;
for (var i = 0; i < arr.length; i += 1) {
if (arr[i] > largestNumber) {
largestNumber = arr[i];
}
}
for (var i = 0; i < arr.length; i += 1) {
if (arr[i] != largestNumber) {
sumTotal += arr[i];
}
}
if (largestNumber === sumTotal) {
return 'The result is true because the sumTotal is ' + sumTotal + ' and the largestNumber is ' + largestNumber;
} else {
return 'Wrong, the sumtotal is ' + sumTotal + ' and the the largestNumber is ' + largestNumber;
}
};
您可以将所有数字相加,最后减去最大
for (var i = 0; i < arr.length; i += 1) {
if (arr[i] > largestNumber) {
largestNumber = arr[i];
}
sumTotal += arr[i];
}
// now because the sumTotal includes the largestNumberAlso
// to get the same result as in your code, you have to
sumTotal -= largestNumber
var myArray = [4, 6, 24, 10, 1, 3];
var arrayAddition = function (arr) {
var largestNumber = arr[0];
var sumTotal = 0;
for (var i = 0; i < arr.length; i += 1) {
if (arr[i] > largestNumber) {
largestNumber = arr[i];
}
sumTotal += arr[i];
}
sumTotal -= largestNumber;
if (largestNumber === sumTotal) {
return 'The result is true because the sumTotal is ' + sumTotal + ' and the largestNumber is ' + largestNumber;
} else {
return 'Wrong, the sumtotal is ' + sumTotal + ' and the the largestNumber is ' + largestNumber;
}
};
还有一项改进使您的代码更快
而不是像这样循环
for( var i = 0; i < arr.length; i += 1 ) { ... }
你可以这样写
for( var i = 0, len = arr.length; i < len; i++ ) { ... }
这样一来,您可以节省一些处理器周期,因为您不需要每次都查找length属性
var myArray = [4, 6, 24, 10, 1, 3];
var arrayAddition = function (arr) {
var largestNumber = arr[0]; // that could satisfy the equation
var sumTotal = 0;
for( var i = 0, len = arr.length; i < len; i++ )
// change it only if it is bigger then the current sum,
// this way the largest number may be incorect if it is
// smaller then the sum, but we don't care for that
// on the other hand we can save some cpu cycles by not
// doing a 'largestNumber = arr[i]' operation
// if we don't really need to
if (arr[i] > sumTotal) {
largestNumber = arr[i];
}
sumTotal += arr[i];
}
sumTotal -= largestNumber;
if (largestNumber === sumTotal) {
return 'The result is true because the sumTotal is ' + sumTotal + ' and the largestNumber is ' + largestNumber;
} else {
return 'Wrong, the sumtotal is ' + sumTotal + ' and the the largestNumber is ' + largestNumber;
}
};
计算第一个循环中所有数字的总和,并找出最大的数字。 那么,其他所有数字的总和就是所有数字最大的总和。 可以这样做:
var myArray = [4, 6, 24, 10, 1, 3];
var arrayAddition = function (arr) {
var largestNumber = arr[0];
var sumTotal = 0;
for (var i = 0; i < arr.length; i += 1) {
sumTotal += arr[i];
if (arr[i] > largestNumber) {
largestNumber = arr[i];
}
}
sumTotal -= largestNumber;
if (largestNumber === sumTotal) {
return 'The result is true because the sumTotal is ' + sumTotal + ' and the largestNumber is ' + largestNumber;
} else {
return 'Wrong, the sumtotal is ' + sumTotal + ' and the the largestNumber is ' + largestNumber;
}
};
重要的是,这些方法在最大数量不止一个的情况下有所不同-在代码中,与最大数量相同大小的所有数字都将被忽略,而在上面的代码中,仅一个实例将被忽略。 解决此问题的方法(假设您要表示的是这种行为)将类似于将循环更改为:
var largestNumber = arr[0];
var largeCount = 0;//We haven't actually seen any yet.
var sumTotal = 0;
for (var i = 0; i < arr.length; i += 1) {
sumTotal += arr[i];
if (arr[i] > largestNumber) {
largestNumber = arr[i];
largeCount = 1; //We have just one of these now
} else if (arr[i] == largestNumber) {
largeCount++; //Another big one is found!
}
}
sumTotal -= largeCount * largestNumber; //Take all largest numbers out.
我认为Igor已将其钉牢,但我想让您知道一些其他有趣的方法,可以获取数组中的最大数字,以及过滤和精简数组。
您可以使用Math.max.apply
来获取数组中的最大数字。
var max = Math.max.apply(null, arr);
同样,您可以使用Math.min.apply
来获取数组中的最小数字。
var min = Math.min.apply(null, arr);
这段代码(IE9及更高版本)使用filter
返回没有最大数量的数组,然后使用reduce
求和。
var sum = arr.filter(function (el) {
return el != max;
}).reduce(function (p, c) {
return p + c;
});
显然,这会使用多个循环,但是您可能会发现有用的信息。
所以我要做的是对数组进行数字排序。 然后将除最后一个以外的所有值相加。
var myArray = [4, 6, 24, 10, 1, 3];
myArray.sort(function(a,b){return a-b});
var arrayAddition = function (arr) {
var largestNumber = arr[arr.length-1]; // get last element; it's the biggest
var sumTotal = 0;
for (var i = 0; i < arr.length-1; i += 1) {
sumTotal += arr[i];
}
if (largestNumber === sumTotal) {
return 'The result is true because the sumTotal is ' + sumTotal + ' and the largestNumber is ' + largestNumber;
} else {
return 'Wrong, the sumtotal is ' + sumTotal + ' and the the largestNumber is ' + largestNumber;
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.