谷歌Foobar挑战失败了5个测试用例中的2个

时间:2017-07-02 04:58:26

标签: python arrays list product puzzle

我正在进行Google Foobar挑战power_hungry(见下文)。

我无法弄清楚为什么以下代码会导致测试用例#3和#5失败。任何人都能看到我失踪的东西吗?我没有考虑边缘案例吗?

这是我的Python代码:

from functools import reduce
import operator

def get_pair_prod(xs):
    if len(xs) < 2:
        return 1
    xs.sort()
    return xs[0] * xs[1]

def answer(xs):
    if len(xs) == 0:
        return "0"
    positive = [x for x in xs if x > 0]
    negative = [x for x in xs if x < 0]  
    if len(negative) == 1 and len(positive) == 0:
        return str(negative[0])
    elif len(negative) == 0 and len(positive) == 0:
        return str("0")  
    positive.append(get_pair_prod(negative))
    return str(reduce(operator.mul, positive, 1))

这是挑战:

电力饥饿

指挥官Lambda的空间站是巨大的。巨大的空间站占据了很大的力量。拥有世界末日设备的巨大空间站需要更多电力。为了满足火车站的电力需求,Commander Lambda在火车站的外表面安装了太阳能电池板。但该站位于类星体量子通量场的中间,这对太阳能电池板造成严重破坏。你和你的心腹团队已被指派修理太阳能电池板,但你无法在不关闭空间站(以及所有那些讨厌的生命支持系统!)的情况下立即将它们全部拆除。

您需要弄清楚任何给定阵列中哪些面板可以离线修复,同时仍然保持每个阵列的最大功率输出量,并且要做到这一点,您首先要弄清楚是什么实际上每个阵列的最大输出。编写一个函数答案(xs),它取一个表示数组中每个面板的功率输出电平的整数列表,并返回这些数字的某些非空子集的最大乘积。因此,例如,如果一个数组包含功率输出电平为[2,-3,1,0,-5]的面板,则可以通过获取子集找到最大乘积:xs [0] = 2,xs [1 ] = -3,xs [4] = -5,给出乘积2 *( - 3)*( - 5)= 30.所以答案([2,-3,1,0,-5])将是& #34; 30&#34;

每个太阳能电池板阵列包含至少1个且不超过50个面板,并且每个面板将具有其绝对值不大于1000的功率输出水平(一些面板故障严重以至于它们正在排水能量,但你知道一个面板和波浪稳定器的技巧,让你结合两个负输出面板,以产生其功率值倍数的正输出)。最终产品可能非常大,因此请将答案作为数字的字符串表示。

语言

要提供Python解决方案,请编辑solution.py 要提供Java解决方案,请编辑solution.java

测试用例

输入:(int list)xs = [2,0,2,2,0]输出:(字符串)&#34; 8&#34;

输入:(int list)xs = [-2,-3,4,-5]输出:(字符串)&#34; 60&#34;

使用verify [file]测试您的解决方案,看看它是如何做的。编辑完代码后,使用submit [file]提交答案。如果您的解决方案通过了测试用例,它将从您的主文件夹中删除。

2 个答案:

答案 0 :(得分:1)

简而言之,您的代码存在相当大的错误,因为您没有正确评估与负数相关的两种情况:负数列表长度为奇数且大于1且负列表长度为偶数但其中大于长度2.一旦你解决了你的问题。

def answer(rg):
    positives = [ x for x in rg if x > 0 ]
    negatives = [ x for x in rg if x < 0 ]
    if len(rg) == 1 or not positives and not negatives:
        return rg[0]
    negatives.sort()
    if len(negatives) % 2 == 1:
        negatives = negatives[:-1]
    product = Decimal(1)
    for x in chain(positives, negatives)
        product *= Decimal(x)
    return product

答案 1 :(得分:0)

我有一个失败的测试案例#5。但是在清理代码并摆脱不必要的计算和循环后,它就被接受了。如果您的代码正确无误并且涵盖了所有测试用例,则可能是在TLE中运行。