JS使用splice删除索引0最大值时为何误删其余数组元素?
题目背景
- 求解LeetCode「买卖股票的最佳时机」题目:给定数组
prices,其中prices[i]为第i天对应的股票价格,规则是选择某一天买入,在后续的某一天卖出,赚取买卖差价,要求返回能获取的最大利润,无法获利时返回0。
异常表现
编写代码的预期逻辑:仅当数组最大值位于索引0位置时,将该最大值从数组中移除。
实际调试时发现splice方法执行后,数组除索引0位置的元素外其余内容全部被删除,不符合预期,调试结果见截图:
问题代码
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)这行,实际执行逻辑是:- 先对原
prices数组调用splice(0,1),确实删掉了原数组索引0位置的1个元素 - 之后把
splice返回的、仅包含被删除的那个首元素的长度为1的数组,重新赋值给了prices变量 - 最终
prices变量里存的只有被删掉的首元素,看起来就像原数组其余元素全被删除了
- 先对原
- 额外说明:这段代码除了splice用法错误外,还有两处逻辑bug:
- 递归调用
maxProfit(prices)没有接收返回值,递归计算的结果不会被返回 theMin、theMax的计算在数组修改前执行,就算splice写法正确,计算用的最大最小值也是修改前数组的数值,结果依然错误。
- 递归调用
内容的提问来源于stack exchange,提问作者Ibleedcoffee
相关产品推荐
相关产品推荐

