Google Foobar 测试用例失败
Posted
技术标签:
【中文标题】Google Foobar 测试用例失败【英文标题】:Google Foobar Test Case Failing 【发布时间】:2016-11-12 01:00:42 【问题描述】:我正在完成一项 google foobar 挑战,但对于我来说,我无法通过第四个测试用例,挑战如下:
您需要确定任何给定阵列中的哪些面板组可以离线进行维修,同时仍保持每个阵列的最大功率输出,要做到这一点,您首先需要弄清楚最大功率是多少每个数组的输出实际上是。编写一个函数 answer(xs),它接受一个整数列表,表示数组中每个面板的功率输出水平,并返回这些数字的某个非空子集的最大乘积。因此,例如,如果一个数组包含功率输出级别为 [2, -3, 1, 0, -5] 的面板,则可以通过获取子集来找到最大乘积:
xs[0] = 2, xs[1] = -3, xs[4] = -5, giving the product 2*(-3)*(-5) = 30. So answer([2,-3,1,0,-5]) will be "30".
每个太阳能电池板阵列包含至少 1 个且不超过 50 个电池板,每个电池板的功率输出水平的绝对值不大于 1000(一些电池板故障严重以至于它们正在消耗能量,但是您知道面板的波稳定器的一个技巧,它可以让您组合两个负输出面板以产生其功率值倍数的正输出)。最终产品可能非常大,因此请以数字的字符串表示形式给出答案。
以下是一些给定的测试用例:
测试用例
Inputs:
(int list) xs = [2, 0, 2, 2, 0]
Output:
(string) "8"
Inputs:
(int list) xs = [-2, -3, 4, -5]
Output:
(string) "60"
这是我的代码:
def product_of_values(lst):
product = 1
if len(lst) > 0:
for x in lst:
product *= x
return product
def answer(xs):
# two seperate list for positive and negative values
positive_list = [x for x in xs if x > 0]
negative_list = [x for x in xs if x < 0]
pos_product = product_of_values(pos_list)
# multiplication of an even number of negatives == positive value
if len(negative_list) % 2 == 0:
negative_product = product_of_values(negative_list)
# if length of negative_list is odd, pop value closest to zero
else:
neg_list.remove(max(neg_list))
neg_product = product_of_values(neg_list)
# If there is only one negative value in the negative_list, return 0.
if len(pos_list) < 1 and len(neg_list) <= 1:
return '0'
else:
return str(neg_product * pos_product)
我是否遗漏了一些明显的东西?
【问题讨论】:
您的代码似乎无法处理单元素列表为负值的情况 @edi_allen 我相信我的底部 if 语句可以处理这种情况;返回 '0' 不是正确的处理方式吗? 我认为这种情况下的答案应该是负值本身。 @edi_allen 是的,你说得对,我今天早些时候发现了 【参考方案1】:@edi_allen 我也面临同样的问题。我已经用 java 编写了代码,可见的测试用例正在我的编译器中传递,但在 foobar 上失败了。你是如何克服这一点的?以下是我的代码:
public static String solution(int[] xs)
if(xs.length < 1 || xs.length > 50)
return "0";
Arrays.parallelSort(xs);
for(int i = 1; i < xs.length ; i++)
if(xs[i] < 0 && xs[i-1] < 0)
xs[i-1] = Math.abs(xs[i-1]);
xs[i] = Math.abs(xs[i]);
BigInteger prod = null;
for(int i = 0; i < xs.length ; i++)
if(Math.abs(xs[i]) > 1000)
return "0";
else if(xs[i] <= 0)
continue;
else if(prod == null)
prod = new BigInteger(String.valueOf(xs[i]));
else
prod = prod.multiply(new BigInteger(String.valueOf(xs[i])));
if(prod == null)
return "0";
return prod.toString();
【讨论】:
【参考方案2】:也许这里的时间复杂度是个问题。
对于产品试试这个 -
from operator import mul
reduce(mul, list, 1)
【讨论】:
以上是关于Google Foobar 测试用例失败的主要内容,如果未能解决你的问题,请参考以下文章
Escape Pods Google Foobar 挑战 |最大流量问题