【问题标题】:Trying to understand a nested .each loop试图理解嵌套的 .each 循环
【发布时间】:2020-02-13 20:32:41
【问题描述】:

我的任务:

实现一个方法#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) Array.index 只会找到第一次出现。如果您有多次出现(例如 99 两次),它只会找到第一个 99。2)您可能希望使用方法 Array.each_with_index 而不是 Array.each。这将消除调用Array.index 的需要,无论如何您都不能在此处使用它,因为它不适用于多次出现。
  • 哦,太好了,是在hackerrank还是其他网站上?可以链接吗?
  • @Casper 非常感谢您的回复。这正是我理解我的问题所需要知道的。

标签: ruby


【解决方案1】:

给定的每日价格如下:

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

价格是17031,以此类推。我假设可以在同一天买卖股票。

第一步是确定每个可能的“买入”日i0 &lt;= i &lt;= prices.size-1、“卖出”日ji &lt;= j &lt;= 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}] 

这告诉我们,如果我们在017)当天买入,我们应该立即卖出,净回报为零。如果我们在13)当天买入,我们应该在415)当天卖出,净收益为15 - 3 = 12。如果我们在 day7 买入,我们应该在 day8 卖出,从而获得9 的回报。

还有待确定return的最大值:

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

这提供了我们需要的所有信息:在h[:buy_day] #=&gt; 1 当天买入,在h[:sell_day] #=&gt; 4 当天卖出,并获得h[:return] #=&gt; 12 的回报。

参见Array#each_indexEnumerable#max_by

【讨论】:

  • 我没有在我的回答中发现 OP 代码的问题,因为@Casper 在对问题的评论中已经这样做了。
  • 感谢您的回复。很高兴知道,但正如你上面所说,Casper 指出了我的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2013-12-28
  • 2014-11-18
  • 1970-01-01
  • 2016-07-24
  • 2015-10-13
相关资源
最近更新 更多