這是一個leet 代碼問題,當我嘗試用自爆代碼回答時:
package main
import "fmt"
func main() {
nums := []int{9, 0, 3, 5, 7}
fmt.Println(subsets(nums))
}
func subsets(nums []int) [][]int {
var result [][]int
result = append(result, []int{})
for _, v := range(nums) {
for _, rv := range(result) {
result = append(result, append(rv, v))
}
}
return result
}
Leetcode 告訴我錯誤的答案:
Wrong Answer
Details
Input
[9,0,3,5,7]
Output
[[],[9],[0],[9,0],[3],[9,3],[0,3],[9,0,3],[5],[9,5],[0,5],[9,0,5],[3,5],[9,3,5],[0,3,5],[9,0,3,7],[7],[9,7],[0,7],[9,0,7],[3,7],[9,3,7],[0,3,7],[9,0,3,7],[5,7],[9,5,7],[0,5,7],[9,0,5,7],[3,5,7],[9,3,5,7],[0,3,5,7],[9,0,3,7,7]]
Expected
[[],[9],[0],[0,9],[3],[3,9],[0,3],[0,3,9],[5],[5,9],[0,5],[0,5,9],[3,5],[3,5,9],[0,3,5],[0,3,5,9],[7],[7,9],[0,7],[0,7,9],[3,7],[3,7,9],[0,3,7],[0,3,7,9],[5,7],[5,7,9],[0,5,7],[0,5,7,9],[3,5,7],[3,5,7,9],[0,3,5,7],[0,3,5,7,9]]
輸出切片索引 15,應該是 [9,0,3,5] 和預期的一樣,但結果是 [9,0,3,7]。于是我嘗試通過 go playgroud online 運行這段代碼,答案是一樣的錯誤,然后我在 goland 中以 debug 模式運行這段代碼,我發現當我制作切片append([9,0,3], 7)時,輸出切片索引 15 同時發生了變化。
我的本地 go env:go 版本 go1.17.6 windows/amd64
我只是golang的初學者,有人可以解釋這種情況嗎?非常感謝你。
ps:我嘗試使用自爆代碼來恢復同樣的問題,但我失敗了。
package main
import "fmt"
func main() {
a := [][]int{{}, {9}, {0}, {9, 0}, {3}, {9, 3}, {0, 3}, {9, 0, 3}, {5}, {9, 5}, {0, 5}, {9, 0, 5}, {3, 5}, {9, 3, 5}, {0, 3, 5}, {9, 0, 3, 5}}
i := 7
for _, v := range a {
// fmt.Println(a)
a = append(a, append(v, i))
// fmt.Println(a)
}
fmt.Println(a)
}
result:
[[] [9] [0] [9 0] [3] [9 3] [0 3] [9 0 3] [5] [9 5] [0 5] [9 0 5] [3 5] [9 3 5] [0 3 5] [9 0 3 5] [7] [9 7] [0 7] [9 0 7] [3 7] [9 3 7] [0 3 7] [9 0 3 7] [5 7] [9 5 7] [0 5 7] [9 0 5 7] [3 5 7] [9 3 5 7] [0 3 5 7] [9 0 3 5 7]]
uj5u.com熱心網友回復:
您在某些切片中重復使用相同的后備陣列,因為append如果有剩余容量,那就是這樣做的。一個簡單的解決方法是用 替換append(rv, v),append(append([]int{}, rv...), v)創建一個全新的切片。另一種方法是通過將切片限制為當前長度來強制追加分配新的后備陣列:append(rv[:len(rv):len(rv)], v)。
帶有作業代碼的游樂場鏈接:https ://go.dev/play/p/Gc-yF5KQOAO
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424139.html
上一篇:命名空間的Golang命名空間
