Saya cuba menyelesaikan masalah subset pada LeetCode menggunakan Go. Saya datang dengan penyelesaian berikut:
func subsets(nums []int) [][]int { sol := make([][]int,0) temp:= make([]int,0) var backtrack func(idx int) backtrack = func(idx int) { sol = append(sol, temp) fmt.Println(temp, append([]int{},temp...)) if idx == len(nums) { return } for i:= idx; i<len(nums);i++{ temp = append(temp,nums[i]) backtrack(i+1) temp = temp[:len(temp)-1] } } backtrack(0) return sol }
Namun, penyelesaian ini tidak betul. Saya perasan bahawa saya perlu menggunakan append(sol,append([]int{},temp...)) dan bukannya sol=append(sol,temp).
Walaupun pernyataan fmt.Println(temp,append([]int{}, temp...)) menjana output yang sama untuk temp dan append([]int{}, temp...), gunakan append([ ]int {}, temp...) sebenarnya berfungsi. Bolehkah seseorang menerangkan perbezaan antara temp dan append([]int{}, temp...) dalam kes ini? Mengapakah versi yang diperbetulkan berfungsi tetapi versi awal tidak?
Dijangkakan bahawa temp
dan append([]int{},temp...)
adalah samatemp
和 append([]int{},temp...)
相同
sol =append(sol, temp)
的问题是您将切片 temp
添加到 sol
Jawapan yang betul
sol =append(sol, temp)
ialah anda menambah kepingan temp
pada sol
dan bukannya item "di dalam" kepingan. Seperti yang dinyatakan dalam Slice internal blog posttemp
在每次迭代中重用,因此 temp
切片下的数组内容将被覆盖,并且您之前添加到 sol
的切片内的值也将被覆盖已修改(因为切片下的数组已修改)。这就是为什么您最终得到错误结果的原因,即使您的 fmt.Println
语句显示在附加之前, temp
, slice ialah "hanya" penunjuk kepada tatasusunan, panjang dan kapasitinya.
Jadi, dalam kes anda, kerana append([]int{}, temp...)
mempunyai nilai yang betul.
Atas ialah kandungan terperinci Tingkah laku pelik tambahan dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!