如何在其他数组中找到一个相交的元素

时间:2017-06-21 08:35:45

标签: go


我有一个类似的阵列:

a:= [1,2,3,4,5]
b:= [5,6,7,8,9]

如何知道数组b在数组a中包含元素而不使用foreach?

3 个答案:

答案 0 :(得分:3)

  

如何知道数组b在数组a中包含元素而不使用foreach?

你做不到。你不应该尝试,因为这是毫无意义的限制。

答案 1 :(得分:1)

如果对数组进行排序(因为它们似乎在您的问题中),则有一种算法比通过每个元素更好。

选择a的第一个元素,将其命名为x。 二进制搜索b表示第一个元素等于或大于x。如果它们相等,则发现两个数组中都包含一个元素,如果没有,则将其作为新的x。现在以同样的方式搜索a x。重复,直到其中一个数组中的元素用完为止。

这可以简单地扩展到任意数量的数组(实际上,使用任意数量的数组更容易编写)。

这是一个快速而肮脏的实现:

package main

import (
    "fmt"
    "sort"
)

func inter(arrs ...[]int) []int {
    res := []int{}
    x := arrs[0][0]
    i := 1
    for {
        off := sort.SearchInts(arrs[i], x)
        if off == len(arrs[i]) {
            // we emptied one slice, we're done.
            break
        }
        if arrs[i][off] == x {
            i++
            if i == len(arrs) {
                // x was in all the slices
                res = append(res, x)
                x++ // search for the next possible x.
                i = 0
            }
        } else {
            x = arrs[i][off]
            i = 0 // This can be done a bit more optimally.
        }
    }
    return res
}

func main() {
    a := []int{1, 2, 3, 4, 5, 7}
    b := []int{5, 6, 7, 8, 9}

    fmt.Println(inter(a, b))
}

答案 2 :(得分:0)

  package main

 import(
 set“github.com/deckarep/golang-set"
)

func array_intersect(a ,b [] interface {})[] interface {} {
 return set.NewSetFromSlice(a).Intersect(set.NewSetFromSlice(b))。ToSlice()
}
 func main(){
 a:= [] interface {} {1,2,3,4,5,7}
 b:= [] interface {} {5,6,7,8,9}

 println(array_intersect(a,b))
}