【问题标题】:Using sort to return an array of largest numbers from subarrays使用排序从子数组中返回一个最大数的数组
【发布时间】:2017-11-27 15:37:42
【问题描述】:

我是一名初学者,一直在通过 FCC 学习。我目前正在尝试解决一个算法挑战,其中我必须返回一个由每个子数组中的最大数组成的数组。非常感谢解释我遗漏或做错了什么,因为它目前只返回第一个数组的零索引。

到目前为止我的代码:

function largestOfFour(arr) {
   var i = 0;
   for (i = 0; i < arr.length; i++){
      arr[i].sort(function(a, b){return b-a});
      return arr[i][0];     
   }
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

【问题讨论】:

  • 因为返回退出。您需要使用 map() 之类的东西并使用 sort() 是可行的,但它的迭代次数比需要的要多得多。

标签: javascript arrays sorting


【解决方案1】:

function 在第一次迭代后遇到return 语句,并没有执行整个数组长度。在这种情况下,目标是从每个子数组中找到最大的,所以找到最大的函数必须在每个子数组上触发

 // find largest in each subarray.the largest will be at 0 index
function largestOfFour(arr) {
  return arr.sort(function(a, b) {
    return b - a
  })[0];


}
var array = [
  [4, 5, 1, 3],
  [13, 27, 18, 26],
  [32, 35, 37, 39],
  [1000, 1001, 857, 1]
]

// looping through the array
array.forEach(function(item) {
  //item will be each subarray
  console.log(largestOfFour(item))

})

【讨论】:

  • 为什么要投反对票?请澄清这将有助于改善答案
  • 谢谢!这确实帮助我了解了为什么我的代码不完整。我还不熟悉 forEach() 方法,但我会做一些研究以便更好地理解。
【解决方案2】:

您正在从循环的第一次迭代中返回。 (return 终止整个函数,因此循环是无用的)。您需要在循环结束后返回,因此您需要一种新的方式来存储结果(另一个数组)。

由于您正在寻找最大数量,因此Math.max 将优于sort

function largestOfFour(arr) {
   var i = 0;
   var results = [];                              // the results array (the array that will contain the maximum numbers)
   for (i = 0; i < arr.length; i++) {
       var max = Math.max.apply(null, arr[i]);    // get the maximum number for the current array (if you want to use sort, it won't be a problem but Math.max is better)
       results.push(max);                         // add this maxumum number to the results array
   }
   return results;                                // when the loop finishes (we got all the maximums), then return
}

console.log(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]));

【讨论】:

  • 感谢您的详尽解释!我仍在学习如何获得我想要的输出,现在意识到 return 如何提前终止它。
【解决方案3】:

您可以在数组上使用map 函数,并为每个子数组取最大值:

arr.map(x => Math.max(...x))
# [ 5, 27, 39, 1001 ]

或者:

arr.map(x => Math.max.apply(null, x))
# [ 5, 27, 39, 1001 ]

【讨论】:

    猜你喜欢
    • 2018-10-01
    • 2016-03-11
    • 2022-11-21
    • 2015-11-03
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2013-05-04
    • 2017-04-24
    相关资源
    最近更新 更多