【问题标题】:Find absolute sum of minimum slice - codility [duplicate]找到最小切片的绝对和 - 可编码性 [重复]
【发布时间】: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


【解决方案1】:

这是取自 here 的 O(n log n) 答案的 javascript 版本:

function solution(A) {
	if (1 == A.length) return Math.abs(A[0]);

	let sums = new Array(A.length + 1);
	let minAbsSum = Number.MAX_SAFE_INTEGER;

	sums[0] = 0;
	
	for (var i = 0; i < A.length; i++) {
		sums[i + 1] = A[i] + sums[i];
	}

	sums.sort();

	for (var i = 1; i < sums.length; i++) {
		minAbsSum = Math.min(minAbsSum, Math.abs(sums[i] - sums[i - 1]));
	}
  
  return minAbsSum;
}

console.log(solution([2, -4, 6, -3, 9]))
console.log(solution([10, 10, 10, 10, 10, -50]))

【讨论】:

  • 非常感谢您的努力。我想更新您,我已经用您的解决方案再次参加了测试,其正确性为 80%,性能为 83%,足以获得及格分数。再次感谢你摇滚。
  • 就是这样。快速提问:如果我的 JS 文档是正确的,那么对于 sum.sort(),“如果省略,则元素按升序排序,ASCII 字符顺序”,所以排序 [0,3,6,9,13,18] way 给了我 [0.13,18,3,6,9],考虑到 ASCII 前提,这是有道理的。排序步骤中不应该提供比较函数吗?
  • @Nick 那是字符串,这些是数字,所以它应该对其进行排序。我不记得这是否不在规范中,可能只是一个浏览器实现,如果数组有数字,则按数字排序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2021-11-26
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多