【问题标题】:Function that takes an array of numbers and returns a new one w/ smallest # in index 0 and largest # in index 1接受一个数字数组并返回一个新的函数,其中索引 0 中的最小 # 和索引 1 中的最大 #
【发布时间】:2015-08-17 20:27:38
【问题描述】:

通过练习来提高我的 Javascript 数组技能。

问题如下:写一个函数maximum_smallest,以一个数字数组作为输入,使用.forEach(),返回一个数组,其中包含第0个位置的最小数字和第一个位置的最大数字位置。

不使用 forEach(),我能想到的唯一方法如下:

var array_of_nums = [7, 8, 120, 60, 10]

function biggest_smallest(array){
  var new_array = []
  for (var i = 0; i < array.length; i++){
    if (array[i] === Math.min.apply(Math, array)){
      new_array.unshift(array[i])
    } else if (array[i] === Math.max.apply(Math, array)) { ? }
  }
  return new_array
}

我无法弄清楚如何将最大的数字放在索引 1 中(更不用说使用 forEach() 方法重构它了)来完成这个练习。我假设我在索引 0 中放置最小数字的方法是正确的。

非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: javascript arrays algorithm


    【解决方案1】:

    假设这应该或多或少像 d3.extent 那样工作,我认为最简单的选择就是使用 Math.minMath.max 检查进行迭代:

    function smallest_biggest(arr) {
        // ditch if no input
        if (!array.length) return [];
        // start with comparable values
        var extent = [Infinity, -Infinity];
        arr.forEach(function(val) {
            extent[0] = Math.min(extent[0], val);
            extent[1] = Math.max(extent[1], val);
        });
        return extent;
    }
    

    Underscore 的 _.min_.max 函数用于跳过第一次检查,结果令人难以置信的是 _.min([]) === Infinity

    【讨论】:

    • 差不多就是这个。也许您可以添加他的代码有什么问题(如果有多个 min 元素,他会多次添加它们,运行复杂度是 O(n^2) 等)
    • 谢谢!一些代码( [Infinity, - Infinity] )让我有点不知所措,但使用 forEach 方法实例化数组中的第零和第一个位置的本质正是我所需要的。我将继续发布我的工作答案,我对其进行了一些简化,以便暂时了解一下。
    • 使用[Infinity, -Infinity] 进行初始化可确保针对真实数组元素的任何最小值/最大值检查将在第一次成功,因为所有数字都小于Infinity 并大于-Infinity。跨度>
    • 啊,现在明白了。再次感谢!
    【解决方案2】:

    edit我的错误,这个问题需要forEach迭代,所以我想需要

    真的不需要迭代,直接用Math.min/Math.max就行了

    function biggest_smallest(array){
       return [Math.min.apply(null, array), Math.max.apply(null, array)];
    }
    

    【讨论】:

    • 你是对的,但他的要求是使用迭代来完成。
    • 我错过了forEach 的要求,我的错。感谢您指出这一点。
    • 还要注意Math.min.apply(null, []) === Infinity,原因与我的回答中指出的相同,即:(
    【解决方案3】:

    首先你需要找到两个变量:a(数组中的最小值)和 b(最大值)。然后,在循环之外(您可以使用 foreach 或常规语法实现),您只需将两个值推送到结果数组:

    new_array.push(a);
    new_array.push(b);
    
    return new_array;
    

    【讨论】:

      【解决方案4】:

      var array_of_nums = [7, 8, 120, 60, 10]
      
      function smallest_biggest(arr) {
          var new_array = []
          arr.forEach(function() {
              new_array[0] = Math.min.apply(Math, arr)
              new_array[1] = Math.max.apply(Math, arr)
          })
          return new_array
      }
      smallest_biggest(array_of_nums)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-14
        • 2021-11-11
        • 2012-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 2013-01-11
        相关资源
        最近更新 更多