Почему в моем диапазоне отображается несуществующее значение в срезе? - PullRequest
0 голосов
/ 12 июля 2020

Я пытался решить проблему Leetcode в Go. Проблема в подмножествах .

Это весь код, который я пишу с некоторым журналом отладки:


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 URL-адрес игрового поля )

Вот результат вышеприведенного кода:


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

Давайте посмотрим 5-й result. (Я указал там как (a)). С этого момента последний элемент result - [9, 0, 3, 5], и это ожидаемое поведение. Однако после этого, когда я пытаюсь написать журнал отладки элемента в result, он меняется на [9, 0, 3, 7] ((b)).

Знаете почему?

1 Ответ

1 голос
/ 12 июля 2020

append заменяет r при необходимости: Вместо:

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

Вы можете использовать:

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

, и вы можете go:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...