Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.5k views
in Technique[技术] by (71.8m points)

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
}

输出:

image.png


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

问题在你注释上面的一段。
你遍历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里的数据进行追加


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...