【发布时间】:2018-08-28 18:43:02
【问题描述】:
您好,我参加了两次 Codility 测试,得分为 0。请帮助我使用 JavaScript 解决问题。
给定一个由 N 个整数组成的非空数组 A。一对整数 (P, Q),使得 0 ≤ P ≤ Q
绝对和最小的最小绝对切片。
例如,数组 A 满足:
A[0] = 2
A[1] = -4
A[2] = 6
A[3] = -3
A[4] = 9
包含以下切片:
- (0,1),其绝对和为 = |2 + (-4)| = 2
- (0,2),其绝对和为 = |2 + (-4) + 6| = 4
- (0,3),其绝对和为 = |2 + (-4) + 6 + (-3)| = 1
- (1,3),其绝对和为 = |(-4) + 6 + (-3)| = 1
- (1,4),其绝对和为 = |(-4) + 6 + (-3) + 9| = 8
- (4,4),其绝对和为 = |9| = 9
切片 (0,3) 和 (1,3) 都是最小绝对切片,它们的绝对和等于 1。
写一个函数:
function solution(A);
给定一个由 N 个整数组成的非空数组 A,返回 min abs slice 的绝对和。
为以下假设编写一个有效的算法:
- N 是 [1..1,000,000] 范围内的整数;
- 数组 A 的每个元素都是 [−10,000..10,000] 范围内的整数;
这是我的解决方案:
function solution(A, i = 0, sum = 0) {
const N = A.length;
if (N === 0) {
return 0;
}
if (N == 1) {
return Math.abs(A[0]);
}
A.sort();
// All positives
if (A[0] >= 0 && A[N - 1] >= 0) {
return Math.abs(A[0]);
}
// All Negatives
if (A[0] <= 0 && A[N - 1] <= 0) {
return Math.abs(A[N - 1]);
}
let currAbsSum = 0;
let minAbsSum = Number.MAX_SAFE_INTEGER;
for (var i = 0; i < N; i++) {
let j = N - 1;
while (j >= i) {
currAbsSum = Math.abs(A[i] + A[j]);
if (currAbsSum === 0) {
return 0;
}
minAbsSum = Math.min(currAbsSum, minAbsSum);
if (Math.abs(A[i]) > Math.abs(A[j])) {
i++;
} else {
j--;
}
}
if (A[i] > 0) break;
}
return minAbsSum;
}
【问题讨论】:
-
首先,JavaScript 和 java 完全不同。选一个。其次,您没有付出任何努力,只是一个问题,因此这可能会被否决并关闭。
-
天哪,这个问题的措辞到处都是。分享原始问题的链接。
-
@achAmháin 感谢您的快速回复。我知道 Java 和 JavaScript 之间的区别,而且我已经尝试了很多但无法解决我在这里发布的原因。 Here 是我的分数。
-
@Geuis,这是一项付费测试,因为我已经参加了测试,所以我无法再次打开链接。虽然如果你想要我写的代码,那么我可以在帖子中添加。
-
您要做的第一件事是对数组进行排序,这已经使以下所有逻辑无效,更改输入的顺序会更改您可以制作的切片
标签: javascript algorithm