append() 可能会修改原始切片(2d 切片递归)

2024年 2月 6日 100.4k 0

append() 可能会修改原始切片(2d 切片递归)

问题内容

(编码问题是生成所有组合的解决方案,这些组合的总和达到目标,候选arr中每个元素的次数不受限制。)

二维 [][]int 切片 theList 在附加 []int (tmpCombo) 的递归中通过引用传递,但附加后,其中一个元素被修改,[3 3 3 3 3 3] 更改为 [3 3 3 3 3 2]。所以我必须在执行 append() 之前复制 tmpComboappend(arr, ele) 是否更改了原始 arr 切片?如果是这样,我应该观察到更多原始的 arr 被修改,但这种情况只发生一次。所以我实际上很困惑这个切片 append() 是如何工作的。

https://go.dev/play/p/PH10SxiF7A5


...
theList: [.... [3 3 3 3 3 3]]
theList: [.... [3 3 3 3 3 2] [3 3 3 3 2 2 2]]

登录后复制

(我还尝试执行 for 循环并继续附加到切片,原始切片根本没有改变...)

package main

import (
"fmt"
"sort"
)

func combinationSum(candidates []int, target int) [][]int {
sort.Sort(sort.Reverse(sort.IntSlice(candidates)))

var theList [][]int
var tmpCombo []int
rCombo(candidates, target, 0, tmpCombo, &theList)

return theList
}

func rCombo(candidates []int, target int, index int, tmpCombo []int, theList *[][]int) {
if index >= len(candidates) {
fmt.Println("index:", index)
return
}
// fmt.Println(target)
if candidates[index] > target {
rCombo(candidates, target, index+1, tmpCombo, theList)
return
}

for i:=index; i登录后复制

正确答案

由于这个答案说明了同一问题,我现在明白了https://www.php.cn/link/0d924f0e6b3fd0d91074c22727a53966一个>.

基本上,如果切片将数据存储在具有指定容量的一个位置,但将长度作为单独的属性...在我的情况下,执行多个 append(tmpCombo, target) 实际上会修改 tmpCombo 中的数据,因为该变量是' t 重新分配/更新新的长度,并且同一位置的基础数据被修改(未重新分配时)。

tldr。确保使用以下任一方式传递相同数据的新副本:

make()新建切片并copy()结束(make()分配具体容量)

append(nil []int, arr...]. (append() 可能会分配更多内存,但适合频繁修改)

以上就是append() 可能会修改原始切片(2d 切片递归)的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论