Пытаясь понять вложенный цикл .each - PullRequest
0 голосов
/ 17 октября 2019

Мое назначение:

Реализуйте метод #stock_picker, который принимает массив цен на акции, по одному на каждый гипотетический день. Он должен возвращать пару дней, представляющих лучший день для покупки и лучший день для продажи. Дни начинаются с 0.

> stock_picker([17,3,6,9,15,8,6,1,10])
=> [1,4]  # for a profit of $15 - $3 == $12

Советы:

  • Вам нужно купить, прежде чем продавать
  • Обратите внимание на крайние случаи, например, когда самый низкий деньпоследний день или самый высокий день - первый день.

Мой код:

def stock_picker(array)

largest = 0
smallest = 1000
largest_index = 1
smallest_index = 0

array.each { |small| 

array.each { |large| 

if small < smallest && array.index(small) < largest_index

        smallest = small
        smallest_index = array.index(small)
    #puts 'smallest = ' + smallest.to_s

end
if large > largest && array.index(large) > smallest_index 

        largest = large
        largest_index = array.index(large)
    #puts "largest = " + largest.to_s
end


    }
}

 [smallest_index, largest_index]

end
p stock_picker([17,3,6,9,15,8,6,1,10])
p stock_picker([4,6,9,34,28,12,2,16,8,44])
p stock_picker([8, 5, 3, 6 ,8, 56, 43, 76, 54, 9])
p stock_picker([6, 2, 7, 3, 1, 7, 3, 8, 4, 9])
p stock_picker([99, 88, 77, 66, 55, 44, 33, 22, 11, 99])

Мой код работает для первых 4 тестов, но застревает на[0,1] для последнего теста. Я не понимаю, почему вложенный .each не будет перебирать заданные значения. Если я поменяю последний '99', он будет работать нормально.

Может кто-нибудь объяснить мне, что я делаю неправильно?

1 Ответ

0 голосов
/ 17 октября 2019

Ниже приведены ежедневные цены:

prices = [17, 3, 6, 9, 15, 8, 6, 1, 10]

Цена 17 в день 0, 3 в день 1 и т. Д. Я предполагаю, что акция может быть куплена и продана в один и тот же день.

Первый шаг - определить для каждого возможного дня «покупки» i, 0 <= i <= prices.size-1 день «продажи» j,i <= j <= prices.size-1, для которого цена самая высокая, и сохраните информацию, необходимую для массива хешей, по одному хешу на каждый возможный день «покупки»:

returns = prices.each_index.map do |i|
  j = (i..prices.size-1).max_by { |j| prices[j] }
  { buy_day: i, sell_day: j, return: prices[j]-prices[i] }
end
  #=> [{:buy_day=>0, :sell_day=>0, :return=>0},
  #    {:buy_day=>1, :sell_day=>4, :return=>12},
  #    {:buy_day=>2, :sell_day=>4, :return=>9},
  #    {:buy_day=>3, :sell_day=>4, :return=>6},
  #    {:buy_day=>4, :sell_day=>4, :return=>0},
  #    {:buy_day=>5, :sell_day=>8, :return=>2},
  #    {:buy_day=>6, :sell_day=>8, :return=>4},
  #    {:buy_day=>7, :sell_day=>8, :return=>9},
  #    {:buy_day=>8, :sell_day=>8, :return=>0}] 

Это говорит нам о том, что если мы покупаем в день 0 (на 17), мы должны сразу продать, что приведет к нулевой чистой прибыли. Если мы покупаем в день 1 (на 3), мы должны продавать в день 4 (на 15), получая чистый доход 15 - 3 = 12. Если мы покупаем в день 7, мы должны продавать в день 8, получая возврат 9.

Осталось определить максимальное значение return:

h = returns.max_by { |h| h[:return] }
  #=> {:buy_day=>1, :sell_day=>4, :return=>12}

Это предоставляет всю необходимую нам информацию: купить в день h[:buy_day] #=> 1, продать в день h[:sell_day] #=> 4 и получить доход в размере h[:return] #=> 12.

См. Array # each_index и перечислимых # max_by .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...