数组中的奇数和

时间:2019-03-16 18:40:19

标签: ruby

我正在尝试获取数组中奇数之和。我正在尝试编写一种方法odd_sums,该方法接受一个数字数组,并在其中返回奇数之和。

odd_sum([5,4,6,13,1]) # => 19
odd_sum([10,2,11,3]) # => 14
odd_sum([8,18]) # => 0 

我在数组中得到了奇数:

def odd_sum(a.)
  new_arr = []
  i = 0
  while i < a.length
    if a.[i] % 2!=0
      new_arr << a.[i]
    end
    i += 1
  end
  return new_arr
end

但是我无法获得奇数之和。请帮助我。

5 个答案:

答案 0 :(得分:11)

我建议:

a = [5, 4, 6, 13, 1]

a.select(&:odd?).sum
#=> 19

答案 1 :(得分:6)

无需多次通过数组或创建临时数组。

def odd_sum(arr)
  arr.sum { |n| n.odd? ? n : 0 }
end

odd_sum([5,4,6,13,1]) #=> 19
odd_sum([10,2,11,3])  #=> 14
odd_sum([8,18])       #=>  0

答案 2 :(得分:3)

更正语法,并使用一个简单的整数存储和(您不需要存储数组)。

[string] $currentDir = $PSScriptRoot
[string] $newDir = $currentDir + '\moveFolder'
[string] $destination = $newDir + '\build\'
New-Item -ItemType Directory -Force -Path $destination
Get-ChildItem -Path $currentDir -Directory -Exclude moveFolder | Move-Item -Destination $destination

查看其他答案以了解如何使用更多类似Ruby的代码。

答案 3 :(得分:2)

编写此代码

a=[5,4,6,13,1]

puts a.select{|x|x.odd?}.sum

答案 4 :(得分:0)

您可以将.selectEnumerable classArray class的方法.sum一起使用

def odd_sum(arr)
  arr.select{|i| i % 2 == 0}.sum
end

#,但是由于您要处理整数数组,因此可以使用.odd?i % 2 == 0做同样的事情,如@Rajagopalan答案所示

def odd_sum(arr)
  arr.select{|i| i.odd? }.sum
  #or the shorthand version: arr.select(&:odd?).sum
end

可以在其中将块传递给.sum的替代语法,这里我们从和中减去数字(如果是偶数)。这有点不太可读,但是是有效的语法,实际上对于您的用例而言效率较低。查看基准。

def odd_sum(arr)
  arr.sum {|i| i.odd? ? i : 0}
end

基于@max发表的其他答案的评论基准。

arr = Array.new(1_00000){rand(1..200)}

puts Benchmark.measure{arr.select(&:odd?).sum}
  0.000000   0.000000   0.000000 (  0.005207)

puts Benchmark.measure{arr.sum{|n|n.odd? ? n : 0}}
  0.000000   0.000000   0.000000 (  0.006952)