Ruby 更改代码顺序会导致错误吗? def库存_选择器价格 最小日,最大日,利润=0,0,0 i=1 而我的长度 (0…i).每天| 如果价格[i]-价格[day]>利润 最小日,最大日,利润=日,i,价格[i]-价格[日] 结束 #i+=1 结束 i+=1 结束 返回“[#{minu_day},#{max_day}” 结束 价格=[17,3,6,9,15,8,6,1,10] 把股票和股票的价格挂钩
我的目标是实现一种“股票选择器”方法,它接收一系列股票价格,每假设一天一个。它应该返回一对代表最佳买入日和最佳卖出日的天数。天从0开始 我的问题是,如果我删除第11行并将其写在第9行,为什么这段代码不起作用。这将导致如下错误:Ruby 更改代码顺序会导致错误吗? def库存_选择器价格 最小日,最大日,利润=0,0,0 i=1 而我的长度 (0…i).每天| 如果价格[i]-价格[day]>利润 最小日,最大日,利润=日,i,价格[i]-价格[日] 结束 #i+=1 结束 i+=1 结束 返回“[#{minu_day},#{max_day}” 结束 价格=[17,3,6,9,15,8,6,1,10] 把股票和股票的价格挂钩,ruby,Ruby,我的目标是实现一种“股票选择器”方法,它接收一系列股票价格,每假设一天一个。它应该返回一对代表最佳买入日和最佳卖出日的天数。天从0开始 我的问题是,如果我删除第11行并将其写在第9行,为什么这段代码不起作用。这将导致如下错误: def stock_picker prices min_day , max_day , profit = 0 , 0 , 0 i = 1 while i < prices.length
def stock_picker prices
min_day , max_day , profit = 0 , 0 , 0
i = 1
while i < prices.length
(0...i).each do |day|
if prices[i] - prices[day] > profit
min_day , max_day , profit = day , i , prices[i] - prices[day]
end
#i += 1
end
i += 1
end
return "[#{min_day}, #{max_day}]"
end
prices = [17,3,6,9,15,8,6,1,10]
puts stock_picker prices
**PS C:\Users\dlim\mystuff>ruby stockpicker.rb
rb:8:in`block in stock_picker':nil:NilClass(NoMethodError)的未定义方法“-”
来自stockpicker.rb:7:in'each'
来自stockpicker.rb:7:in'stock_picker'
来自stockpicker.rb:29:in`'
这是在哪里发生的?
你的错误
当它试图在i=9
时访问prices[i]
并且prices
返回nil
时,
它不响应减号-
运算符
为什么会发生这种情况?
你是一个循环中的一个循环
if prices[i] - prices[day] > profit
在这里增加i
索引计数器变量实际上没有意义,因为
天
已经在范围(0…i)
和
在这个循环中增加i
意味着它比较价格中的每个值
数组一次针对下一个日
价格
内部数组中的值,其中
将仅包括价格的前三个值
(表示
prices
数组的末尾,如1
和10
将永远不会与
彼此);e、 g
在第8次迭代中,当
使用prices[i]
访问prices数组,但仍在
第二个循环的范围为(0…7)
,在第五次迭代后设置,因此
它没有到达while循环的转义子句/表达式
而i
可能的解决方案:
您可以保留您的工作解决方案,也可以使用
另一个范围作为外环
i = 1
prices = [17,3,6,9,15,8,6,1,10]
# iteration 0
if prices[i] - prices[day] > profit
# 3 - 17 > 0 # => false
# iteration 1
i += 1 # => 2
day # => 0
if prices[i] - prices[day] > profit
# 6 - 17 > 0 # => false
i += 1 # => 3
day # => 1
# iteration 2
if prices[i] - prices[day] > profit
# 9 - 3 > 0 # => true
min_day, max_day, profit = 1, 3, 6
i += 1 # => 4
day # => 0
# iteration 3
if prices[i] - prices[day] > profit
# 15 - 17 > 0 # => false
i += 1 # => 5
day # => 1
# iteration 4
if prices[i] - prices[day] > profit
# 8 - 3 > 0 # => true
min_day, max_day, profit = 1, 5, 5
i += 1 # => 6
day # => 2
# iteration 5
if prices[i] - prices[day] > profit
# 6 - 6 > 0 # => false
i += 1 # => 7
day # => 3
# iteration 6
if prices[i] - prices[day] > profit
# 1 - 9 > 0 # => false
i += 1 # => 8
day # => 0
# iteration 7
if prices[i] - prices[day] > profit
# 10 - 17 > 0 # => false
i += 1 # => 9
day # => 1
# iteration 8
if prices[i] - prices[day] > profit
# nil - 3 > 0 # => NoMethodError
而不是在while循环中增加索引计数器变量
(1...prices.length).each do |i|
# ...
end
根据您的要求,它将在以下几天内迭代
def stock_picker prices
min_day , max_day , profit = 0 , 0 , 0
(1...prices.length).each do |i|
(0...i).each do |day|
if prices[i] - prices[day] > profit
min_day , max_day , profit = day , i , prices[i] - prices[day]
end
end
end
return "[#{min_day}, #{max_day}]"
end
prices = [17,3,6,9,15,8,6,1,10]
puts stock_picker prices
更新:
您还可以使用
生成与在所暗示的范围内迭代相同的唯一且不重复的天数对,如下所示
i = 1
while i < prices.length
# ...
i +=1
end
(0...prices.length).to_a.combination(2)
| day,i |
将访问组合数组中的day索引对数组中的第一个和第二个变量,同时重用您使用的现有变量名。您基本上是在尝试重写,并且:
如果您想要天数和相应的价格:
prices = [17, 3, 6, 9, 15, 8, 6, 1, 10]
days = (0...prices.size).to_a
p days.combination(2).max_by { |day1, day2| prices[day2] - prices[day1] }
# => [1,4]
您好,在迭代示例中,您是如何计算天数的?天不是应该在每次按照范围(0…1)迭代时只+1吗。据我所知,在迭代0时,天应该是0,在迭代1时,天应该是1,迭代2时,天应该是2,以此类推。我想我误解了其中的一些部分。重新运行您的原始代码,在它达到
nil
之前,我会得到以下几对[I,day]
:[1,0],[2,0],[3,1],[4,0],[5,1],[6,2],[7,3],[8,0],[9,1]
。对于迭代0和迭代1,它是0
两次的原因是所使用的包含与排除范围;e、 g.(0..1)。to#a=>[0,1]
vs(0…1)。to#a=>[0]
。因此,范围(0…1)
将运行一次,即迭代0,范围(0…2)
将运行两次,即迭代1和2使用构建的范围。
从头到尾运行。使用…
创建的值不包括结束值。
def stock_picker prices
min_day , max_day , profit = 0 , 0 , 0
(1...prices.length).each do |i|
(0...i).each do |day|
if prices[i] - prices[day] > profit
min_day , max_day , profit = day , i , prices[i] - prices[day]
end
end
end
return "[#{min_day}, #{max_day}]"
end
prices = [17,3,6,9,15,8,6,1,10]
puts stock_picker prices
[i, day]
# => [1, 0], [2, 0], [3, 0], [4, 0], [5, 0], [6, 0], [7, 0], [8, 0],
# [2, 1], [3, 1], [4, 1], [5, 1], [6, 1], [7, 1], [8, 1],
# [3, 2], [4, 2], [5, 2], [6, 2], [7, 2], [8, 2],
# [4, 3], [5, 3], [6, 3], [7, 3], [8, 3],
# [5, 4], [6, 4], [7, 4], [8, 4],
# [6, 5], [7, 5], [8, 5],
# [7, 6], [8, 6],
# [8, 7]
(0...prices.length).to_a.combination(2)
def stock_picker prices
min_day , max_day , profit = 0 , 0 , 0
(0...prices.length).to_a.combination(2).each do |day, i|
if prices[i] - prices[day] > profit
min_day , max_day , profit = day , i , prices[i] - prices[day]
end
end
return "[#{min_day}, #{max_day}]"
end
prices = [17,3,6,9,15,8,6,1,10]
puts stock_picker prices
prices = [17, 3, 6, 9, 15, 8, 6, 1, 10]
days = (0...prices.size).to_a
p days.combination(2).max_by { |day1, day2| prices[day2] - prices[day1] }
# => [1,4]
[17,3,6,9,15,8,6,1,10].each.with_index.to_a.
combination(2).max_by{|(buy, day1), (sell, day2)|
sell-buy
}
# => [[3, 1], [15, 4]]