我正在处理编程问题
给出两个整数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]。但是我不知道这里出了什么问题。
答案 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
照顾三个元素:Len
,Cap
和Ptr
。第一个很简单:len()
和cap()
就是它们的用途。最后一个是uintptr
,指向切片包含的数据的内存。
浅切片时,将创建一个新的SliceHeader
,但内容相同,包括Ptr
。因此,底层内存不是复制的,而是共享的。