Back to questions
Ozon Финтех
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
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]