LeetCodeのサブセット化問題をGoを使って解こうとしています。次の解決策を思いつきました:
リーリーただし、この解決策は正しくありません。 sol=append(sol,temp) だけではなく、append(sol,append([]int{},temp...)) を使用する必要があることに気付きました。
fmt.Println(temp,append([]int{}, temp...)) ステートメントは temp と append([]int{}, temp...) に対して同じ出力を生成しますが、append を使用してください([ ]int{}, temp... の修正版) は実際に動作します。この場合の temp と append([]int{}, temp...) の違いを誰かが説明できますか?修正バージョンは動作するのに、初期バージョンは動作しないのはなぜですか?
Expectedtemp
は append([]int{},temp...) と同じです
問題は、項目「内部」の代わりにスライス temp
を sol
に追加していることです。スライス。 スライス内部ブログ投稿
で述べたように、スライスは配列、その長さと容量への「単なる」ポインターです。
したがって、あなたの場合、
は繰り返しごとに 再利用されるため、
temp スライスの下の配列の内容は上書きされ、値は以前に sol に追加したスライス内のものも、変更されたものとして上書きされます (スライスの下の配列が変更されているため)。これが、正しい値を含む
temp を追加する前に
fmt.Println ステートメントが表示されているにもかかわらず、間違った結果が得られる理由です。
append([]int{}, temp...)
以上がGo での追加の奇妙な動作の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。