首页 > 代码库 > Return Largest Numbers in Arrays(算法)

Return Largest Numbers in Arrays(算法)

题目

右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。

提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素。

提示

Comparison Operators

思路

用  for() 循环遍历可得到大数组中的每一项小数组。 

解法一

看到“找到最大值”首先想到的当然是  sort() 方法。但  sort() 在排序时会调用数组每一项的 toString() 方法,比较的是字符串。要实现题目中比较数值的要求,我们可以给  sort() 传递一个降序排列的比较函数: 

//降序排列
function compare(v1,v2){
  return v2 - v1;
}

sort()

返回的是重排序后的数组,是对原数组进行修改,所以可以不必用新变量接收修改后的数组。 对重排序后的数组来说,因为是降序排列,所以每小组中的最大值就是第一项。

声明一个空数组,在循环体内把每个小数组的最大值推入,就是最后想要的返回结果啦!

解法二

对找小数组中最大值的遍历,有人提出了  sort() 的效率问题(感谢  @saymagic 的宝贵意见:blush: ),所以补充一下用  reduce() 做的更优解。 

redece() 是ES5增加的归并数组的方法之一,它会迭代数组所有项,并构建一个最终返回的值。 

保持原思路不变,把解法一中关于小数组排序的模块替换为以下代码:

var l = arr[i].reduce(function(prev,cur,index,array){
      return prev > cur ? prev : cur;
    });

其中,  l 代表小数组中的最大值,在循环中将它推入新声明的空数组,就能得到想要的结果! 

解法

解法一

function largestOfFour(arr) {
  // You can do this!
  var temp = [];
  for (var i = 0; i < arr.length; i++){
    arr[i].sort(function(v1,v2){
        return v2 - v1;
    });
    temp.push(arr[i][0]);
  }
  return temp;
}

解法二

function largestOfFour(arr) {
  // You can do this!
  var temp = [];
  for(var i = 0; i < arr.length; i++){
    var l = arr[i].reduce(function(prev,cur,index,array){
      return prev > cur ? prev : cur;
    });
    temp.push(l);
  }
  return temp;
}

测试

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]) 应该返回一个数组 

largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]) 应该返回  [27,5,39,1001] . 

largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]) 应该返回  [9, 35, 97, 1000000] .

Return Largest Numbers in Arrays(算法)