golang组合生成出错

时间:2019-02-25 04:30:33

标签: go

我正在处理编程问题

  

给出两个整数n和k,返回1 ... n中k个数字的所有可能组合。

,输入n = 5,k = 4,输出应为[[1,2,3,4],[1,2,3,5],[1,2,4,5],[ 1,3,4,5],[2,3,4,5]],以下是我的golang解决方案

curl serveripaddress:30175
not working

我认为我的解决方案是正确的,但是它返回[[1 2 3 5] [1 2 3 5] [1 2 4 5] [1 3 4 5] [2 3 4 5]]。

调试之后,我发现[1 2 3 4]在开始时被添加到结果切片中,但后来更改为[1 2 3 5],导致重复了两个[1 2 3 5]。但是我不知道这里出了什么问题。

1 个答案:

答案 0 :(得分:2)

这是使用append时的常见错误。

当代码运行c:=append(*comb,i)时,它将尝试首先使用基础数组中分配的内存来添加新项,并且仅在未能这样做时才创建新切片。这就是将[1 2 3 4]更改为[1 2 3 5]的原因-因为它们共享相同的基础内存。

要解决此问题,请在要添加到结果中时复制:

now := make([]int,len(*comb))
copy(now,*comb)
*result = append(*result,now)

或使用复制快捷方式:

*result = append(*result, append([]int{},*comb...))

更新:

要了解底层内存的含义,应该了解Go语言切片的内部模型。

在Go中,切片具有称为SliceHeader的数据结构,该数据结构可通过reflect包进行访问,这是您使用unsafe.Sizeof并获取地址时所引用的数据。

SliceHeader照顾三个元素:LenCapPtr。第一个很简单:len()cap()就是它们的用途。最后一个是uintptr,指向切片包含的数据的内存。

浅切片时,将创建一个新的SliceHeader,但内容相同,包括Ptr。因此,底层内存不是复制的,而是共享的。