You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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])

说明

  1. 用stock_price.dup简化数组复制操作,比原代码的replace更直观。
  2. 把计算得到的差价数组diffs作为块的返回值,确保外层map能收集到预期的二维数组。
  3. 执行stock_array.shift的逻辑保留,保证后续计算不会出现买入日期晚于卖出日期的情况。

内容的提问来源于stack exchange,提问作者Shahid Haris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:43:12