【发布时间】:2016-10-04 05:01:53
【问题描述】:
令 A 为非空整数集。编写一个函数 find,它输出 A 的具有最大乘积的非空子集。例如,find([-1, -2, -3, 0, 2]) = 12 = (-2)*(-3)*2
这是我的想法:将列表分为正整数列表和负整数列表:
- 如果我们有偶数个负整数,将两个列表中的所有内容相乘,我们就有了答案。
- 如果我们有奇数个负整数,找出最大的一个并将其从列表中删除。然后将两个列表中的所有内容相乘。
- 如果列表只有一个元素,则返回该元素。
这是我的 Python 代码:
def find(xs):
neg_int = []
pos_int = []
if len(xs) == 1:
return str(xs[0])
for i in xs:
if i < 0:
neg_int.append(i)
elif i > 0:
pos_int.append(i)
if len(neg_int) == 1 and len(pos_int) == 0 and 0 in xs:
return str(0)
if len(neg_int) == len(pos_int) == 0:
return str(0)
max = 1
if len(pos_int) > 0:
for x in pos_int:
max=x*max
if len(neg_int) % 2 == 1:
max_neg = neg_int[0]
for j in neg_int:
if j > max_neg:
max_neg = j
neg_int.remove(max_neg)
for k in neg_int:
max = k*max
return str(max)
我错过了什么吗?附言这是来自 Google 的 foobar 挑战的问题,我显然错过了一个案例,但我不知道是哪个案例。
【问题讨论】:
-
我的意思是数字上最大的负数,如 -1 > -3
-
做 max_neg = abs(neg_int[0]).. 并根据绝对值做比较
-
集合是否需要是最小大小的集合?例如
[2, 3, 1, 1]产生与[2, 3]相同的产品。挑战是否说明了您应该如何解决这种差异? -
不,它没有。我应该说从技术上讲它不是一个集合,因为可以存在重复的值。
-
@Lewis:认为我发现你的代码有错误:假设输入是:
[-1],你的代码返回0作为答案。在某些极端情况下,你return 0return str(0)