请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

有关Golang Slice的提问

老师 你好, 我有关一个在写代码中的问题

我先上代码:

//简单的说下 代码的作用就是 返回所有的子集
func Tianyun_Subsets(nums []int) [][]int {
	result:=make([][]int,0)
	result=append(result,[]int{})
	for i:=0;i<len(nums);i++{
		length:=len(result)
        for j:=0;j<length;j++{
          result = append(result,append(result[j],nums[i]))
		}
	}
   return result
}

//这里是我的 Test case
import (
	"testing"
	"fmt"
)

func TestTianyun_Subsets(t *testing.T) {
	fmt.Println(Tianyun_Subsets([]int{9,0,3,5,7})
}

好了 这道题的正常的输出 应该是这样的:
[[] [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]]

然鹅 我的输出是:
[[] [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]]

我发现的问题在于 有一个重复的 9 0 3 7 按照我的思路 不应该出现这种情况 然后我 debug 了一下 发现了一个比较神奇的地方 也就是我不懂的地方:

图片描述
就是我打圈的地方,本来 9 0 3 5的数值 被改成了 9 0 3 7 导致后面 执行的时候 出现了错误

老师可以回答下 这个是什么原因吗? 拜托了,然后可以指出 哪里写错了吗??
我个人感觉是 append 那里 slice 拓展的原因
谢谢

正在回答 回答被采纳积分+3

1回答

ccmouse 2018-09-18 22:04:12

对,的确是slice扩展的原因。请参考我这里讲到的slice append的工作原理。slice只是下面数据的一个视图,修改slice会造成对下面数据的修改。

我改了一下,我们需要强制拷贝出来,这样可以

result = append(result,
  append(
     append([]int{}, result[j]...),
     nums[i]))

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信