【问题标题】:List the maximum or minimum of the elements at each position of two arrays列出两个数组每个位置的元素的最大值或最小值
【发布时间】:2013-08-06 07:10:10
【问题描述】:

给定两个长度相等的 Fixnum 数组,是否有一种 Ruby 方法可以生成一个数组,其中包含每个索引处的最大值或最小值?

例如:

a1 = [ 10, 30 ]
a2 = [ 5,  35 ]

min 函数将从第一列返回 5,从第二列返回 30,得到 [5, 30]。同样,max 函数将从第一列返回 10,从第二列返回 35,得到 [10, 35]

【问题讨论】:

  • 最小和最大函数的大小是否必须相同?
  • 是否可以比较两个以上的数组?数组可以有两个以上的元素吗?

标签: ruby arrays


【解决方案1】:

您可以在公共位置构造元素数组(即,transpose 一个按行的二维数组到一个按列的二维数组),然后映射出每个元素的最小值或最大值(或其他任何值)专栏:

[a1, a2].transpose.map &:min    #  => [5, 30]
[a1, a2].transpose.map &:max    #  => [10, 35]

【讨论】:

  • 啊,现在我明白他想做什么了。很好的答案。
  • 或者使用minmax 方法同时返回它们。
  • @theTinMan:这与转置然后对每一对进行排序是一样的。
  • [a1, a2].transposea1.zip(a2) 相同,可能更快。
  • 根据 Ruby 2.0.0 上 100 万次 zip 和 transpose 迭代的基准测试,Transpose 更快(非常轻微)。但我认为我更喜欢zip 版本的可读性。
【解决方案2】:
[a1, a2].transpose.map &:minmax

给定一对更大的数组,它会在每个索引处存储最小值。

a1 = [ 10, 30, 8, 15 ]
a2 = [ 17, 23, 5,  35 ]

p [a1, a2].transpose.map &:minmax   #  => [[10, 17], [23, 30], [5, 8], [15, 35]]

鲍罗丁的回答更快。

【讨论】:

    【解决方案3】:

    如果最大的在前,则交换每一对:

    a1 = [ 10, 30 ]
    a2 = [ 5,  35 ]
    
    minmax = a1.zip(a2).map { |pair| pair.sort }
    
    p minmax
    

    输出

    [[5, 30], [10, 35]]
    

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 2021-12-21
      • 2017-01-17
      • 2020-04-09
      • 2019-02-24
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多