【发布时间】:2016-12-08 12:31:46
【问题描述】:
我正在尝试针对编程问题实施 Python 解决方案 查找整数数组中的所有子集。我应该返回一个数组 包含整数数组的所有子集,没有重复项和 排序。
def subsetHelper(cur_set, index, A, ans):
if index >= len(A):
print "appending ", cur_set
ans.append(cur_set)
print "ans: ", ans
return
# don't include current number
subsetHelper(cur_set, index+1, A, ans)
# include current number
cur_set.append(A[index])
subsetHelper(cur_set, index+1, A, ans)
cur_set.pop()
def subsets(A):
A.sort()
ans = []
cur_set = []
# dont include current number
subsetHelper(cur_set, 0, A, ans)
return ans
在 C++ 中实现相同的逻辑会产生正确的返回值。但是,当我在 Python 中执行此操作时,我得到的只是最后的空列表集合,而在迭代期间,它会将相同的当前列表复制到列表中的所有项目,即使打印输出显示它每次都附加正确的子集.为什么会这样?这是输出:
print subsets([1,2,3])
appending []
ans: [[]]
appending [3]
ans: [[3], [3]]
appending [2]
ans: [[2], [2], [2]]
appending [2, 3]
ans: [[2, 3], [2, 3], [2, 3], [2, 3]]
appending [1]
ans: [[1], [1], [1], [1], [1]]
appending [1, 3]
ans: [[1, 3], [1, 3], [1, 3], [1, 3], [1, 3], [1, 3]]
appending [1, 2]
ans: [[1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]
appending [1, 2, 3]
ans: [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
[[], [], [], [], [], [], [], []]
【问题讨论】:
-
我真的不明白你为什么要把这门课。除了传递相同参数的方法之外,您没有实例属性。无论如何,问题在于您传递的是同一个列表,而不是复制。也就是说,您正在建立一个对同一列表的引用列表!每次附加
cur_list时,它都是同一个列表对象。这就是为什么当每次对subsetHelper 的递归调用到达最后一行时最终弹出所有内容时,您最终会得到一个空列表列表。 -
能否请您提供用于获取此输出的完整代码? (即您如何称呼
Solution)。 -
不要使用它,但它可以(就像 itertools 一样)来测试你的实现:
def subsets(L): return sorted([[L[j] for j in range(len(L)) if 1 << j & i] for i in range(2**len(L))]):) -
对不起,我完全搞砸了我的帖子。新的编辑显示了我原来的问题应该是什么样子。此外,我完全意识到拥有解决方案类毫无意义,我只是在一个名为interviewbit.com 的准备网站上复制我在控制台上编写的代码,其中样板代码具有您应该实现的解决方案方法在解决方案类内部。对于所有这些错误,我深表歉意,我会在以后尝试校对我的帖子。