2014-04-15 38 views
1

我剛剛在php中爲TapeEquilibrium問題編寫了一個解決方案。問題是我正在爲Codility提供的自動代碼更新得到一些錯誤的答案。 完成測試的鏈接是Codility worng回答了有關php平衡的問題

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

任何想法什麼是two elements錯誤答案錯誤? 在這個測試中,是否有必要在php中輸入(typecast)變量?我的意思是,你如何告訴編譯器X變量是雙或int在PHP中?多謝!

回答

3

兩個元素的測試用例可能是{-1000,1000}。該陣列只能在一個位置進行分割,距離爲|-1000-1000| = 2000。此輸入的程序返回0,因爲在for循環的第二次迭代中,$ arr_h爲0,$ sum_total也爲0.

只需更改循環for ($i = $count_-1; $i > 0 ; $i--)中的條件即可獲得100%。

0

「兩個元素」測試用例爲{-1000,1000},可以執行附加測試(如果(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; 
} 
-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; 
} 
+0

而究竟這是否回答這些問題? – mrt