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 挑战 |最大流量问题

与兔子一起运行的 Google Foobar Level 4 堆栈溢出

自动化断言失败后,测试用例还会继续执行吗

软件测试复习----测试用例的编写

软件测试复习----测试用例的编写

软件测试复习----测试用例的编写