我刚刚为php中的TapeEquilibrium问题编写了一个解决方案。问题是我为Codility提供的自动代码修改得到了一些错误的答案。 完成测试的链接是
https://codility.com/demo/results/demo2G35FU-EJQ/
有任何想法是two elements
错误答案错误吗?
是否有必要在php中为此测试键入(类型转换)变量?我的意思是,你怎么告诉编译器X变量是php中的double或int?很多!
答案 0 :(得分:3)
两个元素测试用例可能是{-1000,1000}。此数组只能在一个地方拆分,距离为|-1000-1000| = 2000
。此输入的程序返回0,因为在for循环的第二次迭代中,$ arr_h为0,$ sum_total也为0.
只需在循环for ($i = $count_-1; $i > 0 ; $i--)
中更改条件即可获得100%。
答案 1 :(得分:0)
“两个元素”测试用例为{-1000,1000},可以执行附加测试(if(N == 2))来解决此问题。 在进入第二个循环之前,应在将起始值设置为 tmp 变量(看一下我的示例)之后传递“小元素”测试用例。我的例子是在C上,但它可以很容易地用其他语言实现:
int TapeEquilibrium(int A[], int N) {
long long sum = 0;
int i = 0, j = 0;
int min = 1000;
if (N == 2) {
return abs(A[0] - A[1]);
}
for(i = 0; i < N; i++)
{
sum += A[i];
}
long long left = 0;
long long right = sum;
int tmp = abs(left - right);
for(j = 1; j < N; j++)
{
right -= A[j - 1];
left += A[j - 1];
tmp = abs(left - right);
if (min > tmp)
{
min = tmp;
}
}
return min;
}
答案 2 :(得分:-1)
int TapeEquilibrium(int[] A)
{
int p_element = A[1];
// set a[1] equals to sum of all elements without a[0] = (A[1] + ... + A[N-1])
for (int i = 2; i < A.Length; i++)
A[1] = A[1] + A[i];
int result = 100000000;
int dif;
int p = 1;
while (true)
{
dif = abs(A[0] - A[p]);
if (dif < result)
result = dif;
A[0] = A[0] + p_element; // set A[0] equals to (A[0] + A[1] + ... + A[P - 1])
p++;
if (p == A.Length) // check next element is exist
break;
// ==== set A[p] equals to (A[P] + A[P + 1] + ... + A[N - 1]) =====
A[p] = A[p] + p_element;
p_element = A[p] - p_element; // set new p_element
A[p] = A[p - 1] - A[p] + p_element;
// ====
}
return result;
}