前几天我收到了一份工作的代码测试,因此我一直在练习使用他们培训页面 链接中的一些问题
不幸的是,我在磁带平衡问题上只能得到 83/100:
给出了一个由 N 个整数组成的非空零索引数组 A。数组 A 代表磁带上的数字。
任何整数 P,如0 < P < N
,将该磁带分成两个非空部分:A\[0], A\[1], …, A\[P − 1] and A\[P], A\[P + 1], …, A\[N − 1]
。两部分之间的差值是:
换句话说,|(A\[0] + A\[1] + … + A\[P − 1]) − (A\[P] + A\[P + 1] + … + A\[N − 1])|
它是第一部分之和与第二部分之和之间的绝对差。
编写一个函数,给定一个由 N 个整数组成的非空零索引数组 A,返回可以达到的最小差值。
示例:
A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 4 A[4] = 3
我们可以将此磁带分成四个位置:
P = 1
, 差异 = |3 − 10| = 7
P = 2
,差值 = |4 - 9| = 5
P = 3
, 差值 = |6 - 7| = 1
P = 4
, 差值 = |10 - 3| = 7
在这种情况下,我会返回 1,因为它是最小的差异。
N 是一个整数,范围 [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 有点生气。它失败的两个测试区域是“双”(我认为是两个值,-1000 和 1000,以及“小” 。http://codility.com/demo/results/demo9DAQ4T-2HS/
任何帮助将不胜感激,我想确保我没有犯任何基本错误。