golang 语法问题,困扰一个小时了,呜呜呜

处理一个二维数组, 在二维数组每个元素中加入一个数字7, 并再append 到原来数组, 输出的结果不对呀?
[9 0 3 5] 元素变成了 [9 0 3 7] 看输出截图
只看我备注下面的代码逻辑就行了

例子:

[[1],[2],[1,2]]

=> [[1],[2],[1,2], [1,7],[2,7],[1,2,7]]

代码如下

func main(){

subsets([]int{9, 0, 3, 5, 7})

}

func subsets(nums []int) [][]int {

var res = make([][]int, 0)

res = append(res, []int{})

for i := 0; i < 4; i++ {

for _, v := range res {

res = append(res, append(v, nums[i]))

}

}

//只看下面的逻辑就行

fmt.Println(res)

for _, v := range res {

res = append(res, append(v, 7))

}

fmt.Println(res)

return res

}

输出:

golang  语法问题,困扰一个小时了,呜呜呜

回答

问题在你注释上面的一段。
你遍历res数组本身,然后append后再追加到res里,那么res里很多元素其实都是指向同一个底层数组的比如[9,0,3]和[9,0,3,5]
你对[9,0,3]追加了7后[9,0,3,5]那一项也是被影响了的,会变成[9,0,3,7]此时再对他追加一个7那肯定就是[9,0,3,7,7]了。

要么然就构造测试数据时保证内部是不同数组,要么就像楼上说的那样追加时申请一块新内存,对新内存进行追加。不要对res里的数据进行追加

注意区分切片引用与复制,用 copy就好

  //只看下面的逻辑就行

fmt.Println(res)

for _, v := range res {

t := make([]int, len(v))

copy(t, v)

res = append(res, append(t, 7))

}

fmt.Println(res)

打印结果

[[] [9] [0] [9 0] [3] [9 3] [0 3] [9 0 3] [5] [9 5] [0 5] [9 0 5] [3 5] [9 3 5] [0 3 5] [9 0 3 5]]

[[] [9] [0] [9 0] [3] [9 3] [0 3] [9 0 3] [5] [9 5] [0 5] [9 0 5] [3 5] [9 3 5] [0 3 5] [9 0 3 5] [7] [9 7] [0 7] [9 0 7] [3 7] [9 3 7] [0 3 7] [9 0 3 7] [5 7] [9 5 7] [0 5 7] [9 0 5 7] [3 5 7] [9 3 5 7] [0 3 5 7] [9 0 3 5 7]]

以上是 golang 语法问题,困扰一个小时了,呜呜呜 的全部内容, 来源链接: utcz.com/a/67096.html

回到顶部