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

两段逻辑相似的Python代码为何一段触发IndexError?

两段removeDuplicates代码的差异原因解析

问题描述

两段实现removeDuplicates方法的Python代码逻辑看似一致,但运行结果不同:

  1. 第一段代码可正常运行:
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        i = 1
        while i < len(nums)-1:
            if nums[i]==nums[i-1] and nums[i]==nums[i+1]:
                del nums[i]
            else:
                i+=1
        return len(nums)
  1. 第二段代码抛出索引越界错误:

IndexError: list index out of range
if nums[i]==nums[i-1] and nums[i]==nums[i+1]:

第二段代码如下:

class Solution:
        def removeDuplicates(self, nums: List[int]) -> int:
            n = len(nums)-1
            i = 1
            while i < n:
                if nums[i]==nums[i-1] and nums[i]==nums[i+1]:
                    del nums[i]
                else:
                    i+=1
            return len(nums)

两者核心差异:第一段在while循环条件中直接使用len(nums)-1,第二段则提前将初始的len(nums)-1存入变量n,用i < n作为循环判断条件。

报错原因

问题出在列表长度的动态变化上:

  • 第一段代码的循环条件i < len(nums)-1会在每次循环开始时重新计算当前列表的长度。当删除nums中的元素后,列表长度立刻缩短,len(nums)-1也随之变小,确保i永远不会超出当前列表的有效索引范围,自然不会出现nums[i+1]越界的情况。
  • 第二段代码的n是在函数开头就计算好的初始长度减一,这个值固定不变。当删除元素后,列表实际长度已经变短,但n还是原来的数值。比如初始列表长度为5,n=4;删除一个元素后列表长度变为4,此时如果i走到3,满足i < n(3<4),但nums[i+1]就是nums[4],而当前列表的最大索引是3,直接触发索引越界错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:36:22