H5W3
当前位置:H5W3 > 问答 > 正文

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]]

未经允许不得转载:H5W3 » golang 语法问题,困扰一个小时了,呜呜呜

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址