Sobes.tech
Back to questions
Senior
7

Дан отсортированный массив чисел, в котором есть дубли элементов. Нужно убрать дубли in-place (прямо в исходном массиве) и вернуть размер получившегося массива. Пример: Input: nums = [0,0,1,1,1,2,2,3,3,4] Output: 5, nums = [0,1,2,3,4,_,_,_,_,_] Explanation: В данном массиве 5 уникальных элементов. Расположите их на первых пяти позициях в исходном массиве и верните число 5. Последующие элементы в исходном массиве могут быть любыми.

Companies where asked
Ozon ФинтехOzon Финтех

Answer from AI

sobes.tech AI

Для удаления дубликатов из отсортированного массива in-place можно использовать два указателя: один для обхода массива, другой — для позиции записи уникальных элементов.

Идея:

  • Инициализируем writeIndex в 1 (первый уникальный элемент уже на месте).
  • Проходим по массиву с readIndex от 1 до конца.
  • Если текущий элемент не равен предыдущему, записываем его в nums[writeIndex] и увеличиваем writeIndex.

В итоге writeIndex — количество уникальных элементов.

Пример на Go:

func removeDuplicates(nums []int) int {
    if len(nums) == 0 {
        return 0
    }
    writeIndex := 1
    for readIndex := 1; readIndex < len(nums); readIndex++ {
        if nums[readIndex] != nums[readIndex-1] {
            nums[writeIndex] = nums[readIndex]
            writeIndex++
        }
    }
    return writeIndex
}

// Использование:
// nums := []int{0,0,1,1,1,2,2,3,3,4}
// length := removeDuplicates(nums)
// fmt.Println(length) // 5
// fmt.Println(nums[:length]) // [0 1 2 3 4]