天天看点

go 求数组的并集、交集、差集

集合的分类:

并集:以属于A或属于B的元素为元素的集合成为A与B的并(集)

交集: 以属于A且属于B的元素为元素的集合成为A与B的交(集)

差集:以属于A而不属于B的元素为元素的集合成为A与B的差(集)

package main

import "fmt"

//求并集
func union(slice1, slice2 []string) []string {
	m := make(map[string]int)
	for _, v := range slice1 {
		m[v]++
	}

	for _, v := range slice2 {
		times, _ := m[v]
		if times == 0 {
			slice1 = append(slice1, v)
		}
	}
	return slice1
}

//求交集
func intersect(slice1, slice2 []string) []string {
	m := make(map[string]int)
	nn := make([]string, 0)
	for _, v := range slice1 {
		m[v]++
	}

	for _, v := range slice2 {
		times, _ := m[v]
		if times == 1 {
			nn = append(nn, v)
		}
	}
	return nn
}

//求差集 slice1-并集
func difference(slice1, slice2 []string) []string {
	m := make(map[string]int)
	nn := make([]string, 0)
	inter := intersect(slice1, slice2)
	for _, v := range inter {
		m[v]++
	}

	for _, value := range slice1 {
		times, _ := m[value]
		if times == 0 {
			nn = append(nn, value)
		}
	}
	return nn
}

func main() {
	slice1 := []string{"1", "2", "3", "6", "8"}
	slice2 := []string{"2", "3", "5", "0"}
	un := union(slice1, slice2)
	fmt.Println("slice1与slice2的并集为:", un)
	in := intersect(slice1, slice2)
	fmt.Println("slice1与slice2的交集为:", in)
	di := difference(slice1, slice2)
	fmt.Println("slice1与slice2的差集为:", di)
}
           

结果:

go 求数组的并集、交集、差集