1 回答

TA貢獻1841條經驗 獲得超3個贊
Go 中的切片是包含指向底層數組的指針、長度和容量的小描述符。有關更多詳細信息,請參閱切片內部。
將切片傳遞給函數時,會復制描述符,但不會復制底層數組。這意味著currentPath
它將始終指向相同的底層數組,但通過遞歸將具有不同的值:
在節點
11
:currentPath = [5 4 11]
在節點
2
:currentPath = [5 4 11 2]
。添加到paths
長度 4。備份到節點
11
:currentPath = [5 4 11]
在節點
7
:currentPath = [5 4 2 7]
。
在 node7
中,底層數組仍然是相同的,并且與存儲在paths
. 但是節點 7 現在附加7
到長度為 3 的切片上,覆蓋了2
底層數組中的先前值。
一個快速的解決方案是復制currentPath
into的內容,path
而不是直接存儲切片:
if root.Left == nil && root.Right == nil && root.Val == sum {
newSlice := make([]int, len(currentPath))
copy(newSlice, currentPath)
*paths = append(*paths, newSlice)
fmt.Println("paths updated ", *paths)
return
}
重要說明:當切片需要增長時,會復制底層數組,從而產生一個單獨的數組。在示例中,切片在節點處增長到 4 的容量,因此它在節點和4處保持相同的底層數組。如果它在 node 增長,添加到的切片不會與任何人共享其底層數組。272path
- 1 回答
- 0 關注
- 140 瀏覽
添加回答
舉報