【问题标题】:Using nested function finding the second largest number. The function to find the largest number is overriding the original array使用嵌套函数查找第二大数字。查找最大数的函数是覆盖原始数组
【发布时间】:2019-10-14 00:08:47
【问题描述】:

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

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

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。我认为这是因为当我尝试定义变量“最大”时,原始参数数组发生了变化。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

      您找到第二大元素的想法可行,但是,我认为您的代码过于复杂。

      第一步是创建一个函数来查找数组中最大元素的index。您可以通过将最大元素的索引存储在数组中来做到这一点,然后遍历数组中的所有元素以更新此变量:

      function getMaxIndex(arr) {
        var max_idx = 0;
        for(var i = 0; i < arr.length; i++) {
          var current_elem = arr[i];
          var max_elem = arr[max_idx];
          if(current_elem > max_elem) {
            max_idx = i;
          }
        }
        return max_idx;
      }
      
      var nums = [1, 100, 2, -1];
      console.log(getMaxIndex(nums)); // 1, because 100 is at index 1

      现在您有了一个可以检索数组中最大数字的索引的方法,您可以使用.splice(index, 1) 删除这个数字。这将从您的阵列中删除最大的数字。然后您可以再次调用getMaxIndex(),将您的新数组作为输入,这将再次检索您传递的数组中最大元素的索引。该索引将是原始数组中第二大数字的位置:

      function getMaxIndex(arr) {
        var max_idx = 0;
        for(var i = 0; i < arr.length; i++) {
          var current_elem = arr[i];
          var max_elem = arr[max_idx];
          if(current_elem > max_elem) {
            max_idx = i;
          }
        }
        return max_idx;
      }
      
      var nums = [1, 100, 2, -1];
      var to_remove_idx = getMaxIndex(nums);
      nums.splice(to_remove_idx, 1); // remove the index with the biggest number
      var second_largest_idx = getMaxIndex(nums);
      var second_largest = nums[second_largest_idx];
      console.log(second_largest);

      然后您可以将在您的函数之外执行的逻辑封装到它自己的函数中。您可以对此进行概括,以便为数组中的 n<sup>th</sup> 最大数字传递一个数字:

      function getMaxIndex(arr) {
        var max_idx = 0;
        for (var i = 0; i < arr.length; i++) {
          var current_elem = arr[i];
          var max_elem = arr[max_idx];
          if (current_elem > max_elem) {
            max_idx = i;
          }
        }
        return max_idx;
      }
      
      function getNthLargest(lst, n) {
        var arr = lst.slice(); // copy array (so original passed in array is not modified)
        for(var i = 0; i < n-1; i++) {
          var to_remove_idx = getMaxIndex(arr);
          arr.splice(to_remove_idx, 1); // remove the index with the biggest number
        }
        
        var n_index = getMaxIndex(arr);
        var result = arr[n_index];
        return result;
      }
      
      var nums = [1, 100, 2, -1];
      console.log(getNthLargest(nums, 2));

      注意:这种方法效率不高。实际上,将数组按降序排序然后获取n<sup>th</sup>-1 索引会更有效。对于这种情况,最有效的方法很可能是使用Quickselect 算法。

      【讨论】:

        【解决方案3】:

        尝试对数组进行降序排序并在索引 1 处获取项目

        const arrayNumber = [89, 28, 22, 20, 41, 1, 39, 41, 67];
        
        function findSecondLargestNumber (array) {
          if(!array) return undefined;
          
          return array.sort(function(a, b){return b-a})[1];
        }
        
        console.log(findSecondLargestNumber(arrayNumber))

        【讨论】:

          猜你喜欢
          • 2011-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多