登录
首页 >  Golang >  Go问答

为什么我的范围在切片中显示不存在的值?

来源:stackoverflow

时间:2024-04-20 13:42:36 460浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《为什么我的范围在切片中显示不存在的值?》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我试图用 go 解决 leetcode 问题。问题是子集。

这是我正在编写的完整代码以及一些调试日志:

package main

import (
    "fmt"
)

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

func subsets(nums []int) [][]int {
    result := [][]int{
        []int{}, // empty
    }

    for _, num := range nums {  
        fmt.println("==========")
        fmt.println(num)
        fmt.printf("result = %v\n", result)

        temp := [][]int{}
        for _, r := range result {
            fmt.printf("r = %v\n", r)
            temp = append(temp, append(r, num))
        }

        for _, t := range temp {
            result = append(result, t)
        }

        fmt.println("==========")       
    }

    return result
}

(我还准备了go游乐场网址)

这是上面代码的输出:

==========
9
result = [[]]
r = []
==========
==========
0
result = [[] [9]]
r = []
r = [9]
==========
==========
3
result = [[] [9] [0] [9 0]]
r = []
r = [9]
r = [0]
r = [9 0]
==========
==========
5
result = [[] [9] [0] [9 0] [3] [9 3] [0 3] [9 0 3]]
r = []
r = [9]
r = [0]
r = [9 0]
r = [3]
r = [9 3]
r = [0 3]
r = [9 0 3]
==========
==========
7
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]] // (a)
r = []
r = [9]
r = [0]
r = [9 0]
r = [3]
r = [9 3]
r = [0 3]
r = [9 0 3]
r = [5]
r = [9 5]
r = [0 5]
r = [9 0 5]
r = [3 5]
r = [9 3 5]
r = [0 3 5]
r = [9 0 3 7] // (b)
==========
[[] [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]]

让我们看看第五个 result。 (我在那里指出了 (a) )到目前为止, result 的最后一个元素是 [9, 0, 3, 5] ,这是预期的行为。 但是,之后,当我尝试在 result 中写入该元素的调试日志时,它会更改为 [9, 0, 3, 7] ( (b) )。

你知道为什么吗?


解决方案


append 在需要时更改 r
而不是:

temp = append(temp, append(r, num))

您可以使用:

rr := make([]int, len(r))
            copy(rr, r)
            rr = append(rr, num)
            temp = append(temp, rr)

你就可以开始了:

package main

import (
    "fmt"
)

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

func subsets(nums []int) [][]int {
    result := [][]int{
        []int{}, // empty
    }

    for _, num := range nums {
        fmt.println("==========")
        fmt.println(num)
        fmt.printf("result = %v\n", result)

        temp := [][]int{}
        for _, r := range result {
            fmt.printf("r = %v\n", r)
            // append(r, num)
            rr := make([]int, len(r))
            copy(rr, r)
            rr = append(rr, num)
            temp = append(temp, rr)
        }

        for _, t := range temp {
            result = append(result, t)
        }

        fmt.println("==========")
    }

    return result
}

只需调试您的代码,您就会看到,它发生在这里:

temp := [][]int{}
        for _, r := range result {
            fmt.println("result =", result, len(result), cap(result))
            fmt.println("r ==", r, len(r), cap(r))
            fmt.println("num =", num)
            rr := append(r, num)
            fmt.println("r ==", r, len(r), cap(r))
            fmt.println("rr ==", rr, len(rr), cap(rr))
            fmt.println("result =", result, len(result), cap(result))
            fmt.println("temp =", temp)
            temp = append(temp, rr)
            fmt.println("temp =", temp)
        }

什么时候

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]] 16 16
r == [9 0 3] 3 4
num = 7
r == [9 0 3] 3 4
rr == [9 0 3 7] 4 4
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 7]] 16 16

因为:

append(r, num)

今天关于《为什么我的范围在切片中显示不存在的值?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>