繁体   English   中英

遍历数组,找到最大的数字,然后查看所有其他数字是否等于javascript

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM