Szkolenie z równoważności taśmowej równowagi [zamknięte]
Pewnego dnia otrzymałem test pokuty na pracę, dlatego ćwiczyłem wykorzystując niektóre problemy z ich strony treningowejPołączyć
Niestety udało mi się uzyskać tylko 83/100 w pytaniu o równowagę taśm:
Podaje się niepustą tablicę A indeksowaną zerami składającą się z N liczb całkowitych. Tablica A reprezentuje liczby na taśmie.
Każda liczba całkowita P, taka jak 0 <P <N, dzieli tę taśmę na dwie niepuste części: A [0], A [1],…, A [P - 1] i A [P], A [P + 1],…, A [N - 1].
Theróżnica pomiędzy dwiema częściami jest wartość: | (A [0] + A [1] +… + A [P - 1]) - (A [P] + A [P + 1] +… + A [N - 1]) |
Innymi słowy, jest toabsolutny różnica między sumą pierwszej części a sumą drugiej części.
Napisz funkcję, która w przypadku niepustej tablicy A z indeksami N o liczbie całkowitej N zwraca minimalną różnicę, którą można osiągnąć.
Przykład:A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 4 A[4] = 3
Możemy podzielić tę taśmę w czterech miejscach:P = 1
, różnica = | 3 - 10 | = 7P = 2
, różnica = | 4 - 9 | = 5P = 3
, różnica = | 6 - 7 | = 1P = 4
, różnica = | 10 - 3 | = 7
W tym przypadku zwróciłbym 1, ponieważ jest to najmniejsza różnica.
N to int, zakres [2..100.000]; każdy element A to int, zakres [−1,000,1000]. Musi być złożoność czasu O (n),
Mój kod jest następujący:
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;
}
Trochę oszalałem z Math.abs. Dwa obszary testowe, na których się nie udaje, są „podwójne” (co moim zdaniem to dwie wartości, -1000 i 1000 oraz „mała”.http://codility.com/demo/results/demo9DAQ4T-2HS/
Każda pomoc byłaby doceniana, chcę się upewnić, że nie popełniam żadnych podstawowych błędów.