问题
两个数组切片求交集
情况1
1 2
| s1 := []int{1, 4, 5, 4, 7, 8, 6, 2} s2 := []int{2, 4, 6, 3, 4}
|
输出:
思路
采用map记录s1的元素,然后遍历s2,存在于map中并且不重复的增加到新切片中.
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| func intersect1(s1, s2 []int) ([]int, error) { if s1 == nil || s2 == nil { return nil, errors.New("nil silce") } result := []int{} if len(s1) == 0 || len(s2) == 0 { return result, nil } tempMap := make(map[int]bool) for _, v := range s1 { tempMap[v] = true } for _, v := range s2 { if c, ok := tempMap[v]; ok && c { result = append(result, v) tempMap[v] = false } } return result, nil }
|
情况2
1 2
| s1 := []int{1, 4, 5, 4, 7, 8, 6, 2} s2 := []int{2, 4, 6, 3, 4}
|
输出:
思路
依然采用map记录s1的元素,不过需要记录元素出现的次数,然后遍历s2,存在于map中并且不重复的增加到新切片中.
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| func intersect2(s1, s2 []int) ([]int, error) { if s1 == nil || s2 == nil { return nil, errors.New("nil silce") } result := []int{} if len(s1) == 0 || len(s2) == 0 { return result, nil } tempMap := make(map[int]int) for _, v := range s1 { tempMap[v]++ } for _, v := range s2 { if c, ok := tempMap[v]; ok && c > 0 { result = append(result, v) tempMap[v]-- } } return result, nil }
|
备注
两种情况均可以使用for循环嵌套来实现,不过对于出现次数的处理需要思考,并且时间复杂度也比是用map的方式要高。