golang获取切片的交集/差集

一.交集

1.两个切片的交集

采用map的实现取两个切片的交集。其中如果mp[s]访问成功,即有s这个键,ok为true,否则ok为false。以string类型为例:

func intersect(a []string, b []string) []string {
	inter := make([]uint, 0)
	mp := make(map[string]bool)

	for _, s := range a {
		if _, ok := mp[s]; !ok {
			mp[s] = true
		}
	}
	for _, s := range b {
		if _, ok := mp[s]; ok {
			inter = append(inter, s)
		}
	}

	return inter
}

调试:

a := []string{"1", "2", "3", "4", "5", "1", "66", "6"}
b := []string{"6", "7", "", "4", "5", "2"}
for _, s := range intersect(a, b) {
	println(s)
}

输出:
6
4
5
2

2.多个切片的交集

主要思路和2个切片时相同,小区别就是把,map的value类型改为了int用于计数,最后通过计数和传进的lists的长度关系判断是否需要该元素。以uint类型的切片为例:

// intersect 获取交集
func intersect(lists ...[]uint) []uint {
	var inter []uint
	mp := make(map[uint]int)
	l := len(lists)

	// 特判 只传了0个或者1个切片的情况
	if l == 0 {
		return make([]uint, 0)
	}
	if l == 1 {
		for _, s := range lists[0] {
			if _, ok := mp[s]; !ok {
				mp[s] = 1
				inter = append(inter, s)
			}
		}
		return inter
	}

	// 一般情况
	// 先使用第一个切片构建map的键值对
	for _, s := range lists[0] {
		if _, ok := mp[s]; !ok {
			mp[s] = 1
		}
	}

	// 除去第一个和最后一个之外的list
	for _, list := range lists[1 : l-1] {
		for _, s := range list {
			if _, ok := mp[s]; ok {
				// 计数+1
				mp[s]++
			}
		}
	}

	for _, s := range lists[l-1] {
		if _, ok := mp[s]; ok {
			if mp[s] == l-1 {
				inter = append(inter, s)
			}
		}
	}

	return inter
}

调试:

a := []uint{1, 6, 5, 1, 5, 1, 69, 1, 2}
b := []uint{1, 2, 3}
c := []uint{2, 3, 4, 5, 6}
d := intersect(a, b, c)
for _, i := range d {
	println(i)
}

输出:
2

二.差集

首先从将第一个切片中的元素保存到map中,然后遍历第二个切片。如果该key存在,则删除该key。

// minus 获取差集
func minus(a []uint, b []uint) []uint {
	var inter []uint
	mp := make(map[uint]bool)
	for _, s := range a {
		if _, ok := mp[s]; !ok {
			mp[s] = true
		}
	}
	for _, s := range b {
		if _, ok := mp[s]; ok {
			delete(mp, s)
		}
	}
	for key := range mp {
		inter = append(inter, key)
	}
	return inter
}

调试:

a := []uint{1, 6, 5, 1, 5, 1, 69, 1, 2}
b := []uint{1, 2, 3}
d := minus(a, b)
for _, i := range d {
	println(i)
}

输出:
6
5 
69

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Go 语言中,获取切片最后一位的方法是使用索引 -1。例如: ``` s := []int{1, 2, 3, 4} last := s[len(s)-1] ``` 上面的代码将获取切片 `s` 的最后一位的值,并将其存储在变量 `last` 中。 注意,这种方法仅适用于切片的长度大于 0 的情况。如果切片的长度为 0,那么访问切片最后一位的值就会导致索引越界错误。因此,在使用这种方法之前,建议先判断切片的长度是否大于 0。 ### 回答2: 在golang中,可以使用切片的索引来获取其最后一位。 首先,需要了解切片的基本概念。切片是由连续的元素构成的序列,其中每个元素都被分配了一个索引。切片的索引从0开始,到切片长度减1为止。 要获取切片的最后一位,可以使用切片的索引方法。由于切片的长度可以是变化的,可以通过切片长度减1来获取最后一位的索引。然后,通过访问该索引即可获取最后一位的值。 示例如下: ```go package main import "fmt" func main() { // 创建一个切片 letters := []string{"a", "b", "c", "d", "e"} // 获取切片的最后一位 last := letters[len(letters)-1] fmt.Println("切片的最后一位是:", last) } ``` 在上述代码中,我们创建了一个字符串切片 `letters`,然后使用 `len(letters)-1` 来获取切片的最后一个索引。最后,通过 `letters[last]` 来获取最后一位的值。 输出结果为: ``` 切片的最后一位是: e ``` 以上就是使用golang获取切片最后一位的方法。 ### 回答3: 在Go语言中,可以通过索引来获取切片的最后一位。 首先,我们需要了解切片的索引。切片的索引从0开始,切片的最后一位的索引可以通过切片长度减1得到。比如有一个切片slice,可以通过slice[len(slice)-1]来获取最后一位元素。 下面是一个简单的示例代码: ``` package main import "fmt" func main() { // 定义一个切片 slice := []int{1, 2, 3, 4, 5} // 获取切片的最后一位 last := slice[len(slice)-1] // 打印最后一位元素 fmt.Println(last) } ``` 运行这段代码会输出结果5,因为最后一位元素是5。 通过这种方式,我们可以获取任意切片的最后一位元素。注意,如果切片为空,即长度为0,那么这种方式会导致数组越界错误。在实际使用中,我们应该先判断切片长度是否大于0,再去获取最后一位元素,以避免这种错误的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值