【问题标题】:Sum of arrays of different size [closed]不同大小的数组的总和[关闭]
【发布时间】:2016-03-22 09:06:41
【问题描述】:

我有一个数组,它的元素是不同大小的数组,比如说:

[[45, 96, 0.0, 96, 96, 96, 0.0], [04, 55, 06, 55, 04, 04, 02, 55]]

我想求两个数组的和,即,

[49, 151, ...]

【问题讨论】:

  • 好的;您是否已经尝试自己解决此问题?如果是这样,你到底是在哪里卡住的?我一般来说,人们对“请为我编写此代码”的请求(看起来像)的反应不太好,但确实对“我试过了,现在我被卡住了”的反应很好/困惑,请帮助”-请求 ;-)
  • @Carpetsmoker :现在我确实意识到了这件事。我不知道为什么人们实际上对一个问题投了反对票?

标签: ruby-on-rails arrays ruby


【解决方案1】:

你可以这样使用:

a.flat_map{|x| x.in_groups_of(a.max_by(&:size).size, 0)}.transpose.map(&:sum)

或者这个:

a.max_by(&:size).map.with_index{|_, i| a.sum{|x| x[i]||0}}

【讨论】:

  • OP 不想要两个数组中所有值的总和,而是两个数组的“运行”总和。
  • 你试过了吗?虽然它更好,但它错过了总和中的最后一个值(因为第一个数组更短)。
  • 这行得通,尽管对我个人而言,它比我的回答更难理解。我删除了反对票。
  • 我喜欢第二个!
【解决方案2】:

不是很漂亮,但很有效:

>> a = [[45, 96, 0.0, 96, 96, 96, 0.0], [04, 55, 06, 55, 04, 04, 02, 55]]
=> [[45, 96, 0.0, 96, 96, 96, 0.0], [4, 55, 6, 55, 4, 4, 2, 55]]

>> sorted_a = a.sort_by(&:size).reverse
=> [[4, 55, 6, 55, 4, 4, 2, 55], [45, 96, 0.0, 96, 96, 96, 0.0]]

>> zipped_a = sorted_a.first.zip(sorted_a.last)
=> [[4, 45], [55, 96], [6, 0.0], [55, 96], [4, 96], [4, 96], [2, 0.0], [55, nil]]

>> zipped_a.map{ |arr| arr.map{ |v| v || 0 } }.map(&:sum)
=> [49, 151, 6.0, 151, 100, 100, 2.0, 55]

首先,您必须对数组从最长开始进行排序,zip 才能正常工作。然后,压缩将在较短数组的冗余值中创建 nil 值。所以下一步是将这些nils 替换为零(使用嵌套的map),最后你可以sum 的值。

【讨论】:

    【解决方案3】:

    你也可以试试这个方法

    k =[]
    for i in 0..ar.max_by(&:size).length-1 do
     k << ar.map { |x| [x[i]] }
    end
    
    k.map(&:flatten).map{|a| a.compact.sum}
    => [49, 151, 6.0, 151, 100, 100, 2.0, 55]
    

    【讨论】:

      【解决方案4】:
      a = [[45, 96, 0, 96, 96, 96, 0],
           [ 4, 55, 6, 55,  4,  4, 2, 55]]
      
      Array.new(a.max_by(&:size).size) { |i| a.reduce(0) { |t,e| t+e[i].to_i } }
        #=>[49, 151, 6, 151, 100, 100, 2, 55]
      

      注意nil.to_i #=&gt; 0 (ref)。

      另一个例子:

      a = [[1], [2,3,4], [5,6]]
      
      Array.new(a.max_by(&:size).size) { |i| a.reduce(0) { |t,e| t+e[i].to_i } }
        #=> [8,9,4]
      

      【讨论】:

        猜你喜欢
        • 2023-01-03
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        • 2017-02-25
        • 2016-12-31
        • 2014-08-12
        • 2021-03-16
        • 1970-01-01
        相关资源
        最近更新 更多