Ruby循环数组每次迭代删首元素问题及stock_picker方法异常
解决Ruby stock_picker方法的输出问题
问题场景
正在完成The Odin Project的Ruby课程项目,需实现stock_picker方法:接收股票价格数组(元素索引代表日期),最终返回最佳买入和卖出日期。现有实现思路为复制原数组到stock_array,遍历原数组时内部遍历stock_array计算差价,每次外层循环后删除stock_array首元素(避免后期买入前期卖出),但运行结果不符合预期。
现有代码
def stock_picker(stock_price) #copying the array into a new binding stock_array = [] stock_array.replace(stock_price) stock_price.map do |buy| stock_array.map do |sell| sell - buy end #deleting the first element stock_array.shift end end array = stock_picker([17,3,6,9,15,8,6,1,10])
实际输出
[17, 3, 6, 9, 15, 8, 6, 1, 10]
预期输出
[[0, -14, -11, -8, -2, -9, -11, -16, -7], [0, 3, 6, 12, 5, 3, -2, 7], [0, 3, 9, 2, 0, -5, 4], [0, 6, -1, -3, -8, 1], [0, -7, -9, -14, -5], [0, -2, -7, 2], [0, -5, 4], [0, 9], [0]]
问题原因
问题出在stock_price.map的块返回值上:块内先执行了stock_array.map计算差价,但这个结果没有被返回,块最后执行的是stock_array.shift,而shift方法返回的是被删除的数组首元素,因此最终map收集的是每次被删掉的元素(也就是原数组的所有元素),导致输出和原数组一致。
修正代码
def stock_picker(stock_price) stock_array = stock_price.dup stock_price.map do |buy| # 计算当前买入价对应的所有卖出差价 diffs = stock_array.map { |sell| sell - buy } # 删除首元素,避免后续计算出现倒序买卖的情况 stock_array.shift # 将差价数组作为当前块的返回值,供外层map收集 diffs end end array = stock_picker([17,3,6,9,15,8,6,1,10])
说明
- 用
stock_price.dup简化数组复制操作,比原代码的replace更直观。 - 把计算得到的差价数组
diffs作为块的返回值,确保外层map能收集到预期的二维数组。 - 执行
stock_array.shift的逻辑保留,保证后续计算不会出现买入日期晚于卖出日期的情况。
内容的提问来源于stack exchange,提问作者Shahid Haris
相关产品推荐
相关产品推荐

