【问题标题】:TapeEquilibrium: Single failed test case... where is the error?TapeEquilibrium:单个失败的测试用例......错误在哪里?
【发布时间】:2015-09-10 19:49:12
【问题描述】:

TLDR:Codility "Challenge" - my results:错误在哪里?

简短描述 (Full Description):给定一个数组,将数组分成两部分(上下部分),并给出两个可能部分之间的最小差的绝对值。

我的思考过程是:

  1. 为总和创建一个“上”和“下”桶。
  2. 在数组的一次遍历中,我们得到了“上”存储桶的总和。
  3. 然后,一次一个数组值,将数字移入下限(Upper-n,Lower+n)。
  4. 在每一步中,获取差异(Abs(Upper-lower))
  5. 监控最低“最低”

提交代码:

    public int solution(int[] A)
    {
        // Quick results:
        if (A == null) return -1;
        if (A.Length == 0) return -1; // Can't split
        if (A.Length == 1) return -1; // Can't split
        if (A.Length == 2) return Math.Abs(A[0] - A[1]); // Only one way to split

        // Hold above/below/result...
        long lower = 0;
        long upper = 0;
        var min = long.MaxValue;

        // Pass#1: Sum All to get "Upper"
        for (long i = 0; i < A.Length; i++) upper += A[i];

        // Pass#2: 
        // foreach in array
        // ... Shift number from upper to lower
        // ... Calculate new difference/minimum
        for (var i = 0; i < A.Length; i++)
        {
            lower += A[i];
            upper -= A[i];

            var diff = Math.Abs(upper - lower);
            min = Math.Min(min, diff);
            if (diff == 0) return 0;
        }

        return (int) min;
    }

在 13 个测试用例中,Codility 唯一让我失望的是:“Small Numbers”。它说“错误答案,预计 20 得到 0”。它没有显示它使用的测试数据,所以我只能猜测“为什么”。

我的错误在哪里?我想我已经盯着它看太多了,但我似乎无法弄清楚哪种情况会“破坏”我的功能。

编辑:修正翻译。提交给 Codility 的代码使用了 Foreach,而我这里的代码是 For。更正了循环中的变量。

【问题讨论】:

    标签: c#


    【解决方案1】:

    问题在于您没有考虑以下规则之一:0 &lt; P &lt; N
    你的第二个循环假设0 &lt; P &lt;= N

    假设这个输入:

    10, 10, -20
    

    您的代码将返回 0 但 40 是正确的。

    修复:

    将您的第二个循环标题更改为

    for (var i = 0; i < A.Length - 1; i++)
    

    Proof

    【讨论】:

    • 其他人提出了一个答案(现在不见了?),提到了0 &lt; N &lt; P 要求 - 我的答案(没有-1)是0 &lt; N &lt;= P。这绝对解决了问题:) 看起来foreach 循环在多个方面都是错误的。谢谢。
    • @WernerCD:不,没有像这样的其他答案。以我的声誉,我什至可以看到已删除的答案,所以我确定我是唯一一个回答这个问题的人。但是,我确实编辑了我最初非常简短的答案,以包含解释、修复和证明。
    • @DanielHilgarth 预期答案是 20 而不是 40。10-(-10) = 20; 20-(-20) = 40。最小值为 20。
    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2011-04-29
    • 2016-11-14
    相关资源
    最近更新 更多