Суммы нечетных чисел в массиве - PullRequest
2 голосов
/ 16 марта 2019

Я пытаюсь получить сумму нечетных чисел в массиве. Я пытаюсь написать метод 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 ]

11 голосов
/ 16 марта 2019

Я предлагаю:

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

a.select(&:odd?).sum
#=> 19
6 голосов
/ 16 марта 2019

Нет необходимости делать более одного прохода через массив или создавать временный массив.

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
3 голосов
/ 17 марта 2019

Исправление синтаксиса и использование простого целого числа для хранения суммы (вам не нужен массив хранения).

def odd_sum(a)
  sum = 0         
  i = 0
  while i < a.length
    if a[i] % 2 != 0
      sum += a[i]
    end
  i += 1
  end
  return sum      #return can be omitted
end

puts odd_sum([1, 2, 3, 4]) # 4

Посмотрите на другие ответы, чтобы узнать, как использовать больше Ruby-подобного кода.

2 голосов
/ 16 марта 2019

написать этот код

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

puts a.select{|x|x.odd?}.sum
0 голосов
/ 16 марта 2019

Вы можете использовать .select вместе с .sum, которые являются методами перечислимого класса и класса массива

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

# но так как вы имеете дело с массивом целых чисел, вы можете использовать .odd?, который делает то же самое, что и i % 2 == 0, как показано @Rajagopalan answer

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...