【问题标题】:Return Largest Numbers in Arrays返回数组中的最大数
【发布时间】:2018-03-30 15:04:35
【问题描述】:

我试图在一组数组中找到最大的数字并将它们返回到新数组中。但我不明白为什么我的代码不起作用。你能解释一下我的错误吗?

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

    }
  }
}

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

【问题讨论】:

  • “不工作”是什么意思?你有错误吗?你的输出不是你所期望的吗?
  • 您在循环中对arr[i] 进行排序,而不是j,这有什么意义?这只会多次执行相同的排序操作。
  • not working 是一个绝对没有意义的问题描述。如果您在此处需要帮助,请具体。它的工作原理是什么?具体而言是如何工作的?
  • 你想要的实际结果是什么?准确地说,不要让它接受可能的解释。我假设你想要[5, 27, 39, 1001] 结果?然后你想要 one 循环遍历外部数组,在里面你对当前的内部数组进行排序,然后从中选择最大值(第一个或最后一个,取决于排序顺序),并将其放入你的新数组。
  • 抱歉信息丢失。我确信我的代码有很多问题。我认为它会起作用,但它没有。(没有输出)我可以使用预制的解决方案来通过那个教训。我只是想知道这个有什么问题。是的,结果我想要每个数组中的最大数字。

标签: javascript arrays sorting


【解决方案1】:

如果您正在寻找 SUM 最大的数组(因为您说您想要最大的“数字”而不是“数字”),您可以执行以下操作:

function largestOfFour(arr) {
  var sums = [];
  for(var i = 0; i < arr.length; i++){
      var arraySum = 0;
      for(var j = 0; j < arr[i].length; j++){
        arraySum+=arr[i][j];
      }
      sums.push({array: arr[i], sum: arraySum});
   }
   return sums.sort(function(a,b){return b.sum - a.sum})[0].array;
}

【讨论】:

    【解决方案2】:

    你的代码有很多问题。

    • 在循环遍历内部数组时,您正在对它们进行排序,这意味着对于大小为n 的数组,您正在对该数组进行n 次排序。这不必要地低效。
    • 如果你只想要最大/最小元素,排序根本就没有效率;排序一般是 O(n log n) 操作,但仅循环数组是 O(n)(有关更多信息,请参阅 Big O notation)。
    • 尽管您的代码正在对内部数组进行排序,但您并未对结果(即已排序的内部数组的第一个元素)做任何事情。
    • 您没有从函数中返回任何内容,也没有修改输入数组以包含结果(如果打算将数组“就地”修改为返回值)。

    要解决这些问题:

    function largestOfFour(arr) {
      var result = [], max, jMax;
      for (var i = 0; i < arr.length; i++) {
        max = arr[i][0];
        for (var j = 1; j < arr[i].length; j++) {
          if (max < arr[i][j])
            max = arr[i][j];
        }
        result.push(max);
      }
      
      return result;
    }
    
    console.log(
      largestOfFour([
        [4, 5, 1, 3],
        [13, 27, 18, 26],
        [32, 35, 37, 39],
        [1000, 1001, 857, 1]
      ])
    );

    或者更简洁,使用mapreduce 方法:

    function largestOfFour(arr) {
      return arr.map(function(x) {
        return x.reduce(function(a, c) {
          return c < a ? a : c;
        });
      });
    }
    
    
    console.log(largestOfFour([
      [4, 5, 1, 3],
      [13, 27, 18, 26],
      [32, 35, 37, 39],
      [1000, 1001, 857, 1]
    ]));

    【讨论】:

      【解决方案3】:

      获得基本功能的第一次重构涉及使用map 来提取最大值:

      function largestOfFour(arr) {
        for (var i = 0; i < arr.length; i++) {
          for (var j = 0; j < arr[i].length; j++) {
            arr[i].sort(function(a, b) {
              return b - a;
            });
      
          }
        }
      
        // Extract the first element from each array.
        return arr.map(function(a) { return a[0] });
      }
      

      第二遍只涉及更积极地使用map 以及使用max 而不是sort

      function largestOfFour(arr) {
        return arr.map(function(a) {
          return Math.max.apply(null, a);
        });
      }
      

      这避开了进行数字排序所需的丑陋的sort(function(a,b) { ... }) 垃圾。

      【讨论】:

        【解决方案4】:

        如果您希望从所有数组中获取最大的 n 个值,则可以展平列表、排序和瞧。

        var arrayOfArrys = [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]];
        var flattened = [];
        
        for (var _i = 0, arrayOfArrys_1 = arrayOfArrys; _i < arrayOfArrys_1.length; _i++) {
            var arr = arrayOfArrys_1[_i];
            flattened = flattened.concat(arr);
        }
        
        var sorted = flattened.sort(function (a, b) {
            return b - a;
        });
        
        alert(JSON.stringify(sorted));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-28
          • 1970-01-01
          • 2016-03-11
          • 1970-01-01
          • 2020-04-15
          相关资源
          最近更新 更多