почему при использовании pop индекс уходит за границы?
вот нерабочий код
class Solution:
def removeDuplicates(self, nums: list[int]) -> int:
temp = nums[0]
for i in range(1, len(nums)):
if (nums[i] == temp):
nums.pop
else:
temp = nums[i]
return nums
и рабочий код для отладки
class Solution:
def removeDuplicates(self, nums: list[int]) -> int:
temp = nums[0]
for i in range(1, len(nums)):
if (nums[i] == temp):
nums[i] = '_'
else:
temp = nums[i]
return nums
Ответы (1 шт):
По оформлению класса я могу предположить, что вы решаете задачу на Leetcode (https://leetcode.com/problems/remove-duplicates-from-sorted-array/editorial/). В задаче требуется оформить функцию, которая in-place (то есть мы можем работать только с исходным списком, а не создавать его копию) меняет список, удаляя в нём дупликаты, и возвращает длину списка после удаления.
Почему происходит ошибка:
Метод списка pop() меняет его длину во время итерации, что и проводит к ошибке.
Идея решения:
Код начинает итерацию с i = 1
, потому что нам нужно сравнить каждый элемент с предыдущим элементом, чтобы проверить наличие дубликатов.
Основная логика находится внутри цикла for:
- Если текущий элемент
nums[i]
не равен предыдущему элементуnums[i - 1]
, это означает, что мы столкнулись с новым уникальным элементом. - В этом случае мы обновляем
nums[j]
значением уникального элемента вnums[i]
, а затем увеличиваемj на 1
, чтобы отметить следующую позицию для нового уникального элемента. - Делая это, мы эффективно перезаписываем все дубликаты в массиве и сохраняем только уникальные элементы.
После завершения цикла значение j
представляет длину результирующего массива с удаленными дубликатами.