Sobes.tech
Senior

Dado um array ordenado de números que contém elementos duplicados. É necessário remover os duplicados in-place (diretamente no array original) e devolver o tamanho do array resultante. Exemplo: Entrada: nums = [0,0,1,1,1,2,2,3,3,4] Saída: 5, nums = [0,1,2,3,4,_,_,_,_,_] Explicação: Neste array há 5 elementos únicos. Coloque-os nas primeiras cinco posições do array original e retorne o número 5. Os elementos subsequentes no array original podem ser qualquer coisa.

sobes.tech IA

Resposta da IA

Para remover duplicados de um array ordenado in-place, pode usar dois ponteiros: um para percorrer o array, outro para a posição de escrita de elementos únicos.

Ideia:

  • Inicialize writeIndex em 1 (o primeiro elemento único já está no lugar).
  • Percorra o array com readIndex de 1 até ao final.
  • Se o elemento atual não for igual ao anterior, escreva-o em nums[writeIndex] e incremente writeIndex.

No final, writeIndex será a quantidade de elementos únicos.

Exemplo em 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
}

// Uso:
// 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]