【发布时间】:2015-09-10 19:49:12
【问题描述】:
TLDR:Codility "Challenge" - my results:错误在哪里?
简短描述 (Full Description):给定一个数组,将数组分成两部分(上下部分),并给出两个可能部分之间的最小差的绝对值。
我的思考过程是:
- 为总和创建一个“上”和“下”桶。
- 在数组的一次遍历中,我们得到了“上”存储桶的总和。
- 然后,一次一个数组值,将数字移入下限(Upper-n,Lower+n)。
- 在每一步中,获取差异(Abs(Upper-lower))
- 监控最低“最低”
提交代码:
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#