Sobes.tech
Senior

Dany jest posortowany tablica liczb zawierająca duplikaty. Należy usunąć duplikaty in-place (bez tworzenia nowej tablicy) i zwrócić rozmiar otrzymanej tablicy. Przykład: Input: nums = [0,0,1,1,1,2,2,3,3,4] Output: 5, nums = [0,1,2,3,4,_,_,_,_,_] Wyjaśnienie: W tej tablicy jest 5 unikalnych elementów. Umieść je na pierwszych pięciu pozycjach w tablicy i zwróć liczbę 5. Pozostałe elementy w tablicy mogą być dowolne.

sobes.tech AI

Odpowiedź od AI

Aby usunąć duplikaty z posortowanej tablicy in-place, można użyć dwóch wskaźników: jeden do przechodzenia przez tablicę, drugi do pozycji zapisu unikalnych elementów.

Pomysł:

  • Zainicjuj writeIndex na 1 (pierwszy unikalny element jest już na miejscu).
  • Przejdź przez tablicę z readIndex od 1 do końca.
  • Jeśli bieżący element nie jest równy poprzedniemu, zapisz go w nums[writeIndex] i zwiększ writeIndex.

Ostatecznie writeIndex będzie liczbą unikalnych elementów.

Przykład w 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
}

// Użycie:
// 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]