Лучший способ удалить выбранные элементы из среза - PullRequest
4 голосов
/ 14 октября 2019

У меня есть срез A и другой срез B. Слайс A содержит n элементов, а срез B является подмножеством среза A, где каждый элемент является указателем на срез A.

Какой самый дешевый метод дляудалить все элементы из A, который упоминается в B.

После того, как я прибегну к методу googling, я могу подумать о том, чтобы слить срез A для каждого элемента в B. Это единственный метод или есть более простой?

1 Ответ

2 голосов
/ 14 октября 2019

У меня есть срез A и другой срез B. Срез A содержит n элементов, а срез B представляет собой подмножество среза A, где каждый элемент является указателем на срез A.

Что будетсамый дешевый метод удаления всех элементов из A, который указан в B.

A и B могут иметь дубликаты и не могут быть отсортированы.


Например, скорость роста O(n),

package main

import "fmt"

func remove(a []int, b []*int) []int {
    d := make(map[*int]bool, len(b))
    for _, e := range b {
        d[e] = true
    }
    var c []int
    if len(a) >= len(d) {
        c = make([]int, 0, len(a)-len(d))
    }
    for i := range a {
        if !d[&a[i]] {
            c = append(c, a[i])
        }
    }
    return c
}

func main() {
    a := []int{0, 1, 2, 3, 4, 5, 6, 7}
    fmt.Println(a)
    b := []*int{&a[1], &a[3], &a[3], &a[7], &a[4]}
    a = remove(a, b)
    fmt.Println(a)
}

Детская площадка: https://play.golang.org/p/-RpkH51FSt2

Выход:

[0 1 2 3 4 5 6 7]
[0 2 5 6]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...