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

Google Foobar challenge failing 2 out of 5 test cases

我正在进行 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 的 space 站很大。巨大的 space 站需要大量电力。带有世界末日装置的巨大 space 站需要更多的电力。为了满足空间站的电力需求,Lambda 指挥官在空间站外表面安装了太阳能电池板。但该站位于类星体量子通量场的中间,这对太阳能电池板造成了严重破坏。你和你的手下团队已被指派去修理太阳能电池板,但你不能在不关闭 space 站(以及所有那些讨厌的生命维持系统!)的情况下立即将它们全部拆除。

您需要弄清楚任何给定阵列中的哪些面板组可以离线维修,同时仍保持每个阵列的最大功率输出量,为此,您首先需要弄清楚是什么每个数组的最大输出实际上是。编写一个函数 answer(xs),它采用表示数组中每个面板的功率输出级别的整数列表,以及 returns 这些数字的某个非空子集的最大乘积。因此,例如,如果一个阵列包含功率输出水平为 [2、-3、1、0、-5] 的面板,则可以通过获取子集找到最大乘积:xs[0] = 2, xs[1 ] = -3, xs[4] = -5, 给出乘积 2*(-3)*(-5) = 30。所以 answer([2,-3,1,0,-5]) 将是“ 30".

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

语言

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

测试用例

输入:(int list) xs = [2, 0, 2, 2, 0] 输出:(string) "8"

输入:(整数列表)xs = [-2, -3, 4, -5] 输出:(字符串)“60”

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

简而言之,您的代码有很多错误,因为您没有正确评估与负数相关的两种情况:否定列表长度为奇数且大于 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

我有一个失败的测试用例 #5。但是在清理代码并摆脱不必要的计算和循环时,它被接受了。如果您的代码在其他方面是正确的并且涵盖了所有测试用例,那么它可能 运行 进入 TLE。