我在leetcode中练习了“从排序数组中删除重复项”的测试。一切都很好,但是当我测试input [1,1]时,它失败了:
IndexError: list index out of range
我可以知道为什么吗?(我已经有了正确的解决方案,但是我仍然想知道这个错误。)
这是我的代码:
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
index_o=0
i=1
while i <len(nums):
if nums[index_o]==nums[i]:
nums.remove(nums[i])
index_o-=1
i-=1
print("nums[index_o]:",nums[index_o])
print("index_o:",index_o)
print("nums[i]:",nums[i])
print("i:",i)
print("nums:",nums)
else:
index_o+=1
i+=1
return len(nums)
n=[1,1]
a=Solution()
print(a.removeDuplicates(n))
print(n)
结果如下:
f:leetcode>python 190626.py
nums[index_o]: 1
index_o: -1
nums[i]: 1
i: 0
nums: [1]
Traceback (most recent call last):
File "190626.py", line 228, in <module>
print(a.removeDuplicates(n))
File "190626.py", line 217, in removeDuplicates
print("nums[index_o]:",nums[index_o])
IndexError: list index out of range
这是正确的解决方案:
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
index_o=0
i=1
while i <len(nums):
if nums[index_o]==nums[i]:
nums.remove(nums[index_o])
else:
index_o+=1
i+=1
return len(nums)
答案 0 :(得分:1)
在循环的第三次迭代中,您拥有变量i=-1
和n = []。您的代码输入到第一个if
,因为-1 < 0
等于True
。*
这时,您尝试使用变量index_o
(即-2)访问数组。由于您的数组为空,因此n [-2]返回IndexError: list index out of range
错误。
您对代码的一些评论:
-该算法未达到预期的效果,但我可以理解您的想法。
-为什么删除重复项功能会返回输出数组的长度,而不是返回数组本身的长度?
-要测试该算法,可以使用内置的set()
,它将从数组中删除重复项。然后可以比较它们。
-在开发算法时,请始终按照@ Mark-meyer在注释中的建议通过打印值来使用调试。
*我没有在本地运行算法并进行调试,只是从头开始跟踪它。因此,某些值可能会相差一。
答案 1 :(得分:0)
当第一次到达执行while
循环并且if
的语句为true时,变量index_o
的值为-1,变量{{1} }将为0,i
循环将再次以while
的身份运行。因此,下一次,i=0 < len(nums)=1
语句将检查没有索引的if
。我建议您添加一个if nums[-1] == nums[0]
语句,以确保您的数组指针不会得到负值。