查找具有最大乘积的一组整数的子集

时间:2016-10-04 05:01:53

标签: python algorithm

设A是一组非空的整数。编写一个函数 find ,输出具有最大乘积的A的非空子集。例如, find([ - 1,-2,-3,0,2])= 12 =( - 2)*( - 3)* 2

这就是我的想法:将列表分成正整数列表和负整数列表:

  1. 如果我们有一个偶数个负整数,那么将两个列表中的所有内容相乘,我们就得到了答案。
  2. 如果我们有一个奇数个负整数,找到最大值并将其从列表中删除。然后将两个列表中的所有内容相乘。
  3. 如果列表只有一个元素,则返回此元素。
  4. 这是我在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挑战中的一个问题,我显然错过了一个案例,但我不知道哪个。

    现在这里有实际问题: enter image description here

4 个答案:

答案 0 :(得分:1)

您可以使用reduce(在Py3中的functools中)

来简化此问题
import functools as ft
from operator import mul

def find(ns):
    if len(ns) == 1 or len(ns) == 2 and 0 in ns:
        return str(max(ns))
    pos = filter(lambda x: x > 0, ns)
    negs = sorted(filter(lambda x: x < 0, ns))
    return str(ft.reduce(mul, negs[:-1 if len(negs)%2 else None], 1) * ft.reduce(mul, pos, 1))

>>> find([-1, -2, -3, 0, 2])
'12'
>>> find([-3, 0])
'0'
>>> find([-1])
'-1'
>>> find([])
'1'

答案 1 :(得分:1)

from functools import reduce
from operator import mul

def find(array):
    negative = []
    positive = []
    zero = None
    removed = None

    def string_product(iterable):
        return str(reduce(mul, iterable, 1))

    for number in array:
        if number < 0:
            negative.append(number)
        elif number > 0:
            positive.append(number)
        else:
            zero = str(number)

    if negative:
        if len(negative) % 2 == 0:
            return string_product(negative + positive)

        removed = max(negative)

        negative.remove(removed)

        if negative:
            return string_product(negative + positive)

    if positive:
        return string_product(positive)

    return zero or str(removed)

答案 2 :(得分:1)

这是一个循环中的解决方案:

def max_product(A):
    """Calculate maximal product of elements of A"""
    product = 1
    greatest_negative = float("-inf") # greatest negative multiplicand so far

    for x in A:
        product = max(product, product*x, key=abs)
        if x <= -1:
            greatest_negative = max(x, greatest_negative)

    return max(product, product // greatest_negative)

assert max_product([2,3]) == 6
assert max_product([-2,-3]) == 6
assert max_product([-1, -2, -3, 0, 2]) == 12
assert max_product([]) == 1
assert max_product([-5]) == 1

额外信用:如果整数约束放宽了怎么办?在循环中你需要收集哪些额外信息?

答案 3 :(得分:0)

这是另一个不需要库的解决方案:

def find(l):
    if len(l) <= 2 and 0 in l: # This is the missing case, try [-3,0], it should return 0
        return max(l)
    l = [e for e in l if e != 0] # remove 0s    
    r = 1
    for e in l: # multiply all
        r *= e 
    if r < 0: # if the result is negative, remove biggest negative number and retry
        l.remove(max([e for e in l if e < 0]))
        r = find(l)
    return r

print(find([-1, -2, -3, 0, 2])) # 12
print(find([-3, 0])) # 0

编辑:

我想我找到了丢失的案例,即列表中只有两个元素,最高的是0。