繁体   English   中英

Golang 切片 append 异常

[英]Golang slice append exception

这是一个leet 代码问题,当我尝试用代码回答时:

package main

import "fmt"

func main() {
    nums := []int{9, 0, 3, 5, 7}
    fmt.Println(subsets(nums))
}

func subsets(nums []int) [][]int {
    var result [][]int
    result = append(result, []int{})
    for _, v := range(nums) {
        for _, rv := range(result) {
            result = append(result, append(rv, v))
        }
    }
    return result
}

Leetcode 告诉我错误的答案:

Wrong Answer
Details 
Input
[9,0,3,5,7]
Output
[[],[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,7],[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,7,7]]
Expected
[[],[9],[0],[0,9],[3],[3,9],[0,3],[0,3,9],[5],[5,9],[0,5],[0,5,9],[3,5],[3,5,9],[0,3,5],[0,3,5,9],[7],[7,9],[0,7],[0,7,9],[3,7],[3,7,9],[0,3,7],[0,3,7,9],[5,7],[5,7,9],[0,5,7],[0,5,7,9],[3,5,7],[3,5,7,9],[0,3,5,7],[0,3,5,7,9]]

output slice index 15,本来应该是[9,0,3,5],结果却是[9,0,3,7]。 所以我尝试通过 go playgroud 在线运行这段代码,答案是同样的错误,然后我在调试模式下在 goland 中运行这段代码,我发现当我制作切片append([9,0,3], 7) , output 分片索引15同时变化。

我本地go env: go version go1.17.6 windows/amd64

我只是golang的初学者,谁能解释一下这种情况? 非常感谢你。

ps:我尝试使用自爆代码来恢复同样的问题,但我失败了。

package main

import "fmt"

func main() {
    a := [][]int{{}, {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}}
    i := 7
    for _, v := range a {
        // fmt.Println(a)
        a = append(a, append(v, i))
        // fmt.Println(a)
    }
    fmt.Println(a)
}

result:
[[] [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]]

您在某些切片中重复使用相同的支持数组,因为如果有剩余容量,这就是append所做的。 一个简单的解决方法是将append(rv, v)替换为append(append([]int{}, rv...), v) ,创建一个全新的切片。 另一种方法是通过将切片限制到其当前长度来强制 append 分配一个新的支持数组: append(rv[:len(rv):len(rv)], v)

带有工作代码的游乐场链接: https://go.dev/play/p/Gc-yF5KQOAO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM