【问题标题】:TapeEquilibrium Problem in Java for CodilityJava 中用于 Codility 的 TapeEquilibrium 问题
【发布时间】:2019-06-30 19:20:07
【问题描述】:

我正在尝试编写代码以克服 codility 带来的挑战之一,但返回的值是错误的。请帮助我理解它。 给定一个整数数组,目标是在给定索引处将其拆分为 2 个较小的数组,对每个数组求和并找到 2 个数组之间可能的最小绝对差。

例子:

我有一个数组 A[] = {3, 1, 2, 4, 3}。

如果我在索引 1 处拆分,左数组是 {3},右数组是 {1,2,4,3}。绝对差是|(3) - (1 + 2 + 4 + 3)| = 7。

最小可能的拆分是索引为 3,其中左数组为 {3, 1, 2},右数组为 {4, 3},绝对差为 |(3 + 1 + 2) - (4 + 3 )| = 1。

这是我的代码:

import java.lang.*;

class Solution {
    public int solution(int[] A) {
        // write your code in Java SE 8
        int difference  = 0;
        int leftSum = 0;
        int rightSum = 0;
        int minValue = 0;
        for (int i = 1; i < A.length; i++) {
            int c = i - 1;
            while(c >= 0) {
                leftSum = A[c] + leftSum;
                c--;
            }
            int a = i;
            while(a < A.length) {
                rightSum = A[a] + rightSum;
                a++;
            }
            difference = Math.abs(leftSum - rightSum);
            int temp = difference;
            minValue = temp;

            if (difference < minValue) {
                minValue = difference;
            }
        }

        return minValue;
    }
}

【问题讨论】:

  • 能否指定编码问题,同时给出问题的测试用例?
  • @VishwasAtrey 已编辑

标签: java arrays algorithm


【解决方案1】:

您可能需要提供有关该任务的更多信息,以便我们尝试找出您的失误。但是,看看我看到的代码

minValue = 0;
difference = Math.abs(leftSum - rightSum);
int temp = difference;
minValue = temp;
if (difference < minValue) {
    minValue = difference;
}

由此,difference 将始终等于minValuedifference &lt; minValue 失败。

【讨论】:

  • @JainamShah 尝试进行上述更改;这是第一步。不需要int temp = difference; minValue = temp;
  • @JainamShah 和 minValue 设置为 Integer.MAX_VALUE 而不是 0。
【解决方案2】:

最小化值 |(A[0] + ... + A[P-1]) - (A[P] + ... + A[N-1])|。两部分的差值是:|(A[0] + A[1] + ... + A[P - 1]) - (A[P] + A[P + 1] + .. . + A[N - 1])|.

public int solution(int[] A) {
 int N = A.length;
 int leftsum = 0;
 int difference;
 int rightSum;
 int min = Integer.MAX_VALUE;
 int sum = 0;
 for (int i = 0; i < N; i++) {
  sum = sum + A[i];
 }
 for (int i = 0; i < N - 1; i++) {
  leftsum = leftsum + A[i];
  rightSum = sum - leftsum;
  difference = Math.abs(rightSum - leftsum);
  min = Math.min(min, difference);
 }
 return min;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2022-10-04
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多