JavaScript 中的最小最大和 - 如何获取 5 元素数组中 4 个元素的最小和和最大和

Hap*_*s31 2 javascript arrays for-loop

HackerRank 挑战赛链接

我的想法是循环遍历数组,每次将数组中除了一个元素之外的所有元素相加,然后找到最小和和最大和。

我知道.splice()可以从数组中删除任何元素。但目前,使用我的代码,它只从数组中删除一个元素一次。即这只给了我一大块:

function miniMaxSum(arr) {

  let smallestSum = 0;
  let largestSum = 0;

  for (let i = 0; i < arr.length; i++) {
    let chunk = arr.splice(1);
    console.log(chunk);
    if (chunk > largestSum) largestSum = chunk;
    if (chunk < smallestSum) smallestSum = chunk;
  }
  return (smallestSum, largestSum);
}
Run Code Online (Sandbox Code Playgroud)

我需要在每次循环时从数组中删除一个元素,然后从该数组中获取最大和最小和。

所以对于给定的数组[1, 2, 3, 4, 5]

我应该得到以下可能的“块”:

[2, 3, 4, 5],,,,, .[1, 3, 4, 5]​[1, 2, 4, 5]​​[1, 2, 3, 5][1, 2, 3, 4]

总和最大的块是[2, 3, 4, 5]

总和最小的块是[1, 2, 3, 4]。

如何调整我的代码以获得给定数组中所有可能的 4 位数组,以便我可以比较它们的总和,仍然使用 for 循环?或者如果不使用 for 循环,您还有什么建议?

编辑:现在使用Math.min()和Math.max()来获取数组中的最小和最大元素。然后使用.filter()删除这些元素来创建新数组。然后获取这些数组的总和。

function miniMaxSum(arr) {

  let smallest = Math.min(...arr);
  let largest = Math.max(...arr);

  let smallestArray = arr.filter(element => element !== largest);
  let largestArray = arr.filter(element => element !== smallest);

  let sumOfSmallestArray = 0;
  let sumOfLargestArray = 0;

  for (let i = 0; i < smallestArray.length; i++) {
    sumOfSmallestArray += smallestArray[i];
  }

  for (let i = 0; i < largestArray.length; i++) {
    sumOfLargestArray += largestArray[i];
  }

  return ([sumOfSmallestArray, sumOfLargestArray]).toString();
}

Run Code Online (Sandbox Code Playgroud)

但即使它在我的控制台中工作,它在 HackerRank 中却不起作用。

Ral*_*lph 6

关键是首先对该数组进行排序,然后最小值将是第一个元素,最大值将是最后一个元素,因此如果你想获得最小值集,它将是没有最高值(最后一个元素)的数组,如果您想要获得最大值,它将是没有最小值(第一个元素)的数组。

let data = [1, 3, 2, 4, 5];

// sort first
data = data.sort((a, b) => a - b);
  
// to get the sets only
let maxSet = data.slice(1);
let minSet = data.slice(0, -1);

console.log(minSet, maxSet);

// to get just the max/min value
const sum = data.reduce((a, total) => a + total, 0);
console.log(sum - data[data.length - 1], sum - data[0]);
Run Code Online (Sandbox Code Playgroud)