我正在进行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]提交答案。如果您的解决方案通过了测试用例,它将从您的主文件夹中删除。
答案 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中运行。