Я получил тест на кодовость на днях для работы, поэтому я практиковал использование некоторых проблем со своей обучающей страницы Ссылка
К сожалению, мне удалось получить 83/100 на вопрос "Равноправие на ленте":
Дается непустой нуль-индексированный массив A, состоящий из N целых чисел. Массив A представляет числа на ленте.
Любое целое число P, такое, что 0 < P < N, разбивает эту ленту на две непустые части: A [0], A [1],..., A [P - 1] и A [P], A [P + 1],..., A [N - 1 ].
Разница между двумя частями - это значение: | (A [0] + A [1] +... + A [P - 1]) - (A [P] + A [P + 1] +... + A [ N - 1]) | Другими словами, это абсолютная разница между суммой первой части и суммой второй части.Напишите функцию, которая при задании непустого нулевого индекса A из N целых чисел возвращает минимальную разницу, которая может быть достигнута.
Пример:
A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 4 A[4] = 3
Мы можем разбить эту ленту в четырех местах:P = 1
, разность = | 3 - 10 | = 7P = 2
, разность = | 4 - 9 | = 5P = 3
, разность = | 6 - 7 | = 1P = 4
, разность = | 10 - 3 | = 7
В этом случае я бы вернул 1, поскольку это наименьшая разница.N - это int, диапазон [2.00.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. Две области тестирования, которые он терпит неудачу, являются "двойными" (что, я думаю, имеет два значения: -1000 и 1000 и "small". http://codility.com/demo/results/demo9DAQ4T-2HS/
Любая помощь будет оценена, я хочу убедиться, что я не делаю никаких основных ошибок.