Slice的坑

1、Slice容量不够时,再append就变成新生成的一个slice了

参见填golang slice的append的“坑” - 知乎 (zhihu.com)

2、append时结果不变

在leetcode的46题,我的代码如下

func permute(nums []int) [][]int {
    if len(nums) == 0{
        return [][]int{}
    }
    result := [][]int{}
    track := []int{}
    used := make([]bool, len(nums))
    backtrack(nums, &track, &used, &result)
    return result
}

func backtrack(nums []int, track *[]int, used *[]bool, result *[][]int){
    // 触发结束条件
    if len(*track) == len(nums){
        temp := make([]int, len(*track))
		copy(temp, *track) // 一定要copy到temp中再append,不能直接把*track append到*result中
        *result = append(*result, temp)
        return
    }

    for idx, num := range nums{
        // 排除不合法的选择
        if (*used)[idx]{
            continue // nums[idx]已经做过选择
        }
        // 做选择
        *track = append(*track, num)
        (*used)[idx] = true
        // 进入下一层决策树
        backtrack(nums, track, used, result)
        // 撤销选择
        *track = (*track)[:len(*track)-1]
        (*used)[idx] = false
    }
    return
}

 在这段代码中

 我的本意是将*track append到*result中,但是直接append结果不对,result不变,然而copy一遍后再append到*result的话就对了,所以显然不是第一条slice的容量的坑,目前还没发现原因,夜已深,后面找到原因了再填坑

猜你喜欢

转载自blog.csdn.net/qq_55621259/article/details/128309784