javascript - 使用嵌套函数查找第二大数字。查找最大数的函数会覆盖原始数组

标签 javascript arrays

嗨,我应该创建一个返回第二大数字的函数。我开始这样做是为了运行函数来查找最大的数字。然后我想从数组中忽略最大的数字并再次运行相同的函数。我只被允许使用循环。推送、弹出切片、索引、循环和条件

我尝试过切换循环位置并使用变量。我尝试改变事情的范围。我还考虑创建一个新的空数组变量,运行一个循环并将所有不是最大的项插入其中,然后在该数组上运行最大数字函数。

var largest = 0;

var findSecondLargest = function(array) {

  for (b = array.length; b > 0; b--)
    largest = findLargest(array); {
    console.log(largest + "largest" + array)
  }
  for (n = array.length; n > 0; n--)
    if (array[n] >= largest)
      array.splice(n, 1);
    else if (array[n] > array[b])
    array.splice(n, 1);
  else if (array[n] < array[b])
    array.splice(-1, 1);
  return array;
};

var findLargest = function(array1) {
  for (x = 0; x <= array1.length; x++) {
    for (j = array1.length; j > 0; j--) {
      if (array1[j] > array1[x])
        array1.splice(x, 1);
      else if (array1[x] > array1[j])
        array1.splice(-1, 1);
    }
  }
  return (array1);
};


findSecondLargest([89, 28, 22, 20, 41, 1, 39, 41, 67]);

findSecondLargest([89, 28, 22, 20, 41, 1, 39, 41, 67]) // returns 67

这是它应该做的,但它只返回 89。我认为这是因为当我尝试定义变量“largest”时原始参数数组发生了更改。

最佳答案

排序是浪费。我们可以使用线性空间和时间确定第二大数 -

const secondLargest = (xs = []) =>
  xs.reduce
    ( ([ $0, $1 ], x) =>
        x >= $0
          ? [ x, $0 ]
      : x >= $1
          ? [ $0, x ]
      : [ $0, $1 ]
    , [ -Infinity, -Infinity ]
    )
    [1]

console.log(secondLargest([89, 28, 22, 20, 41, 1, 39, 41, 67]))
// 67

关于javascript - 使用嵌套函数查找第二大数字。查找最大数的函数会覆盖原始数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58368731/

相关文章:

javascript - 如何在这个 api 中访问这个 json 对象?

javascript - 如何使数组中收集的循环值在循环外部可用以供将来使用

javascript - JSON - 如果对象的值等于

javascript - 从键/值对象对中查找最大值 Javascript

javascript - 如何在数组中生成N个数字,这些数字的总和等于0

javascript - 使用 jQuery 获取 div 中每个图像的源

javascript - 如何在客户端发出自定义 "POST"请求?

javascript - 拖动后检测鼠标松开

JavaScript 错误 : "ReferenceError: array is not defined"

c++ - 声明多维数组时出现堆栈溢出异常