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
}
输出:
回答
问题在你注释上面的一段。
你遍历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