从切片中删除选定元素的最佳方法

时间:2019-10-14 11:45:11

标签: go

我有一个切片A和另一个切片B。切片A包含n个元素,切片B是切片A的子集,其中每个元素都是指向切片A的指针。

从B中删除所有从A中删除所有元素的最便宜的方法是什么。

经过一番谷歌搜索之后,我想到的唯一方法是为B中的每个元素重新切片A。这是唯一的方法还是有一种更简单的方法?

1 个答案:

答案 0 :(得分:2)

  

我有一个切片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]