почему при использовании 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 шт):

Автор решения: Runneso

По оформлению класса я могу предположить, что вы решаете задачу на Leetcode (https://leetcode.com/problems/remove-duplicates-from-sorted-array/editorial/). В задаче требуется оформить функцию, которая in-place (то есть мы можем работать только с исходным списком, а не создавать его копию) меняет список, удаляя в нём дупликаты, и возвращает длину списка после удаления.

Почему происходит ошибка:

Метод списка pop() меняет его длину во время итерации, что и проводит к ошибке.

Идея решения:

Код начинает итерацию с i = 1, потому что нам нужно сравнить каждый элемент с предыдущим элементом, чтобы проверить наличие дубликатов.

Основная логика находится внутри цикла for:

  1. Если текущий элемент nums[i] не равен предыдущему элементу nums[i - 1], это означает, что мы столкнулись с новым уникальным элементом.
  2. В этом случае мы обновляем nums[j] значением уникального элемента в nums[i], а затем увеличиваем j на 1, чтобы отметить следующую позицию для нового уникального элемента.
  3. Делая это, мы эффективно перезаписываем все дубликаты в массиве и сохраняем только уникальные элементы.

После завершения цикла значение j представляет длину результирующего массива с удаленными дубликатами.

→ Ссылка