我如何从javascript中的数组中获取第二大元素

新手上路,请多包涵

我有一个像这样的整数数组:

 arr[20,120,111,215,54,78];

我需要一个以数组作为参数并返回该数组的第二大元素的函数。

原文由 Amar Banerjee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 534
2 个回答

原答案

var secondMax = function (){
    var arr = [20, 120, 111, 215, 54, 78]; // use int arrays
    var max = Math.max.apply(null, arr); // get the max of the array
    arr.splice(arr.indexOf(max), 1); // remove max from the array
    return Math.max.apply(null, arr); // get the 2nd max
};

演示

更新 1

正如 davin 所指出的,可以通过不进行拼接来提高性能,而是 暂时 将最大值替换为 -Infininty

 var secondMax = function (arr){
    var max = Math.max.apply(null, arr), // get the max of the array
        maxi = arr.indexOf(max);
    arr[maxi] = -Infinity; // replace max in the array with -infinity
    var secondMax = Math.max.apply(null, arr); // get the new max
    arr[maxi] = max;
    return secondMax;
};

无论如何,恕我直言,最好的算法是杰克的。 1 遍,转换为数字。我的很短,使用内置方法,只是想提供它作为替代方案,以展示您可以实现目标的所有不同方式。

更新 2

具有多个值的边缘情况。

正如评论指出的那样:如果我们有一个像 [3, 3, 5, 5, 5, 4, 4] 这样的数组,这个解决方案“不起作用”。另一方面,我们认为“第二大元素”也是一个解释问题。在示例中,我们有:

  1. 在索引处具有最大值 (5) 的 3 个元素:2、3、4
  2. 在索引处具有第二大值 (4) 的 2 个元素:5,6
  3. 在索引处具有第二小值 (3) 的 2 个元素:1,2

第二大元素可以解释为:

  1. 第二个(最大元素)- 索引 3 处的 5 - 假设有一个订单,并且我们的目标是一个唯一值
  2. (第二大)元素 - 索引 5 处的 4 - 假设有一个订单,并且我们的目标是唯一值

原文由 Matyas 发布,翻译遵循 CC BY-SA 4.0 许可协议

在不修改原始数组的情况下,最直接的实现是迭代并跟踪最大的和下一个最大的:

 function nextBiggest(arr) {
  let max = -Infinity, result = -Infinity;

  for (const value of arr) {
    const nr = Number(value)

    if (nr > max) {
      [result, max] = [max, nr] // save previous max
    } else if (nr < max && nr > result) {
      result = nr; // new second biggest
    }
  }

  return result;
}

const arr = ['20','120','111','215','54','78'];
console.log(nextBiggest(arr));

原文由 Ja͢ck 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题