Sobes.tech
Junior — Middle

Как ефективно да премахнете елемент от слайс, без да запазвате реда на елементите, като същевременно не надвишавате постоянната сложност на операцията?

sobes.tech AI

Отговор от AI

Ако искате да премахнете елемент от срез в Go без да запазвате реда на елементите и с операция с постоянна сложност O(1), можете да замените премахвания елемент с последния елемент от среза и след това да съкратите среза с един.

Пример:

func removeUnordered(s []int, i int) []int {
    s[i] = s[len(s)-1] // заменя елемента i с последния
    return s[:len(s)-1] // съкращава среза
}

// Използване:
s := []int{10, 20, 30, 40, 50}
s = removeUnordered(s, 1) // премахва елемента с индекс 1 (20)
// Сега s може да бъде, например, [10, 50, 30, 40]

Този метод не запазва реда на елементите, но работи много бързо, тъй като не изисква преместване на елементи.