TapeBalance:单个失败的测试用例..错误在哪里

本文关键字:测试用例 错误 在哪里 失败 单个 TapeBalance | 更新日期: 2023-09-27 17:59:42

TLDR:Codibility"Challenge"-我的结果:错误在哪里?

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

我的思维过程是:

  1. 为总和创建一个"上"answers"下"桶
  2. 在数组的一次遍历中,我们得到"上"bucket的和
  3. 然后,一次一个数组值,将数字移到低位(Upper-n,lower+n)
  4. 在每一步中,获得差值(Abs(上下))
  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个测试用例中,Codibility唯一让我失望的是:"小数字"。上面写着"答错了,预期20得到0"。它没有显示它使用的测试数据,所以我只能猜测"为什么"。

我的错误在哪里?我觉得我盯着它看得太多了,但我似乎不知道什么情况会"破坏"我的功能。

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

TapeBalance:单个失败的测试用例..错误在哪里

问题是您没有考虑其中一个规则:0 < P < N
第二个循环假设0 < P <= N

假设此输入:

10, 10, -20

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

修复:

将第二个循环标题更改为

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

证明