Когда я использую функцию добавления golang для создания 2D-среза, предыдущее значение в срезе изменяется - PullRequest
0 голосов
/ 14 марта 2020

Вот мой код:

package src

func Subsets(nums []int) [][]int {
    var sets = make([][]int, 0)
    var t = make([]int, 0)
    sets = append(sets, t)
    for i := 0; i < len(nums); i++ {
        for _, v := range sets {
            t = append(v, nums[i])
            sets = append(sets, t)      }
    }
    return sets
}

Тестовые данные: [] int {1,2,3,4,5}
Я отлаживаю их. обнаружил, что:

Когда вычисляются множества [22], множества [15] из [] int {1,2,3,4} изменяются на [] int {1,2,3,5}

Что случилось.

1 Ответ

1 голос
/ 14 марта 2020

Проблема в том, что элементы типа sets ссылаются на один и тот же фрагмент.

Вам лучше создать новый фрагмент для каждого элемента sets. Добавление не создает новый фрагмент.

Это исправление, которое копирует предыдущий вектор sets, а не просто расширяет его.

package src

func Subsets(nums []int) [][]int {
    var sets = make([][]int, 0)
    var t = make([]int, 0)
    sets = append(sets, t)
    for i := 0; i < len(nums); i++ {
        for _, v := range sets {
            t = append([]int(nil), v...) // t is copy of v
            t = append(t, nums[i])
            sets = append(sets, t)
        }
    }
    return sets
}

Проверено здесь: https://play.golang.org/p/OZ9nN_t3w9D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...