先日、就職の為にコディリティテストを受けたので、トレーニングページの リンクからいくつかの問題を使って練習してきました。
残念ながら、Tape-Equilibrium の質問では 83/100 しか得られませんでした。
N 個の整数で構成される空でないゼロ インデックスの配列 A が与えられます。配列 A は、テープ上の数字を表します。
のような任意の整数 P は、0 < P < N
このテープを 2 つの空でない部分に分割しますA\[0], A\[1], …, A\[P − 1] and A\[P], A\[P + 1], …, A\[N − 1]
。
2 つの部分の差は次の値です。|(A\[0] + A\[1] + … + A\[P − 1]) − (A\[P] + A\[P + 1] + … + A\[N − 1])|
つまり、最初の部分の合計と 2 番目の部分の合計の絶対差です。
N 個の整数の空でないゼロ インデックスの配列 A が与えられた場合に、達成できる最小の差を返す関数を作成します。
例:
A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 4 A[4] = 3
このテープを 4 つの場所に分割できます:
P = 1
、差 = |3 − 10| = 7
P = 2
、差 = |4 − 9| = 5
P = 3
、差 = |6 − 7| = 1
P = 4
、差 = |10 − 3| = 7
この場合、差が最小であるため 1 を返します。
N は int で、範囲は [2..100,000] です。A の各要素は int の範囲 [−1,000..1,000] です。O(n) 時間の複雑さである必要があります。
私のコードは次のとおりです。
import java.math.*;
class Solution {
public int solution(int[] A) {
long sumright = 0;
long sumleft = 0;
long ans;
for (int i =1;i<A.length;i++)
sumright += A[i];
sumleft = A[0];
ans =Math.abs(Math.abs(sumright)+Math.abs(sumleft));
for (int P=1; P<A.length; P++)
{
if (Math.abs(Math.abs(sumleft) - Math.abs(sumright))<ans)
ans = Math.abs(Math.abs(sumleft) - Math.abs(sumright));
sumleft += A[P];
sumright -=A[P];
}
return (int) ans;
}
私は Math.abs に少し腹を立てました。失敗する 2 つのテスト領域は「double」です (これは、-1000 と 1000 の 2 つの値と「small」だと思います 。http://codility.com/demo/results/demo9DAQ4T-2HS/
基本的な間違いを犯していないことを確認したいと思います。