TapeBalance:单个失败的测试用例..错误在哪里
本文关键字:测试用例 错误 在哪里 失败 单个 TapeBalance | 更新日期: 2023-09-27 17:59:42
TLDR:Codibility"Challenge"-我的结果:错误在哪里?
简短描述(完整描述):给定一个数组,将数组一分为二(上下部分),并给出两个可能部分之间的最小绝对值差。
我的思维过程是:
- 为总和创建一个"上"answers"下"桶
- 在数组的一次遍历中,我们得到"上"bucket的和
- 然后,一次一个数组值,将数字移到低位(Upper-n,lower+n)
- 在每一步中,获得差值(Abs(上下))
- 监视器最低"最小值"
提交代码:
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。已更正循环中的变量。
问题是您没有考虑其中一个规则:0 < P < N
第二个循环假设0 < P <= N
。
假设此输入:
10, 10, -20
您的代码将返回0,但40是正确的。
修复:
将第二个循环标题更改为
for (var i = 0; i < A.Length - 1; i++)
证明