Sobes.tech
Senior

Δεδομένου ενός ταξινομημένου πίνακα αριθμών που περιέχει διπλότυπα στοιχεία. Πρέπει να αφαιρέσετε τα διπλότυπα in-place (ακριβώς στον αρχικό πίνακα) και να επιστρέψετε το μέγεθος του προκύπτοντος πίνακα. Παράδειγμα: Είσοδος: nums = [0,0,1,1,1,2,2,3,3,4] Έξοδος: 5, nums = [0,1,2,3,4,_,_,_,_,_] Επεξήγηση: Σε αυτόν τον πίνακα υπάρχουν 5 μοναδικά στοιχεία. Τοποθετήστε τα στις πρώτες πέντε θέσεις του αρχικού πίνακα και επιστρέψτε τον αριθμό 5. Τα επόμενα στοιχεία στον αρχικό πίνακα μπορεί να είναι οτιδήποτε.

sobes.tech AI

Απάντηση από 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]