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

JS使用splice删除索引0最大值时为何误删其余数组元素?

题目背景
  • 求解LeetCode「买卖股票的最佳时机」题目:给定数组prices,其中prices[i]为第i天对应的股票价格,规则是选择某一天买入,在后续的某一天卖出,赚取买卖差价,要求返回能获取的最大利润,无法获利时返回0。
异常表现

编写代码的预期逻辑:仅当数组最大值位于索引0位置时,将该最大值从数组中移除。
实际调试时发现splice方法执行后,数组除索引0位置的元素外其余内容全部被删除,不符合预期,调试结果见截图:
LeetCode调试器显示数组被误删的截图

问题代码
var maxProfit = function (prices) {
  let theMin = Math.min(...prices)
  let minPosition = prices.indexOf(theMin)
  let theMax = Math.max(...prices)
  let maxPosition = prices.lastIndexOf(theMax)

  if (maxPosition === 0) {
    prices = prices.splice(0, 1)
    if (prices.length === 0) {
      return 0
    }

    maxProfit(prices)
  }

  return theMax - theMin
};
splice方法不符合预期的原因
  • 核心错误是对splice方法的返回值理解有误:splice是原地修改原数组的方法,执行后会直接改动调用它的原数组,它的返回值是所有被删除的元素组成的新数组,不是修改完成后的原数组。
  • 你写的prices = prices.splice(0, 1)这行,实际执行逻辑是:
    1. 先对原prices数组调用splice(0,1),确实删掉了原数组索引0位置的1个元素
    2. 之后把splice返回的、仅包含被删除的那个首元素的长度为1的数组,重新赋值给了prices变量
    3. 最终prices变量里存的只有被删掉的首元素,看起来就像原数组其余元素全被删除了
  • 额外说明:这段代码除了splice用法错误外,还有两处逻辑bug:
    • 递归调用maxProfit(prices)没有接收返回值,递归计算的结果不会被返回
    • theMin、theMax的计算在数组修改前执行,就算splice写法正确,计算用的最大最小值也是修改前数组的数值,结果依然错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:15:40