Codility worng回答关于php的TapeEquilibrium

时间:2014-04-15 02:32:29

标签: php

我刚刚为php中的TapeEquilibrium问题编写了一个解决方案。问题是我为Codility提供的自动代码修改得到了一些错误的答案。 完成测试的链接是

https://codility.com/demo/results/demo2G35FU-EJQ/

有任何想法是two elements错误答案错误吗? 是否有必要在php中为此测试键入(类型转换)变量?我的意思是,你怎么告诉编译器X变量是php中的double或int?很多!

3 个答案:

答案 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;
}