简体   繁体   English

Codility Java 中的 TapeEquilibrium 问题

[英]TapeEquilibrium Problem in Java for Codility

I am trying to code through one of the challenges from codility but the value returned is wrong.我正在尝试编写代码以应对 codility 带来的挑战之一,但返回的值是错误的。 Please help me through it to understand it.请帮助我理解它。 Given an integer array, the objective is to split it at a given index into 2 smaller arrays, sum each arrays and find the smallest absolute difference possible between the 2 arrays.给定一个 integer 数组,目标是在给定索引处将其拆分为 2 个较小的 arrays,对每个 arrays 求和,并找到 2 个 arrays 之间可能的最小绝对差值。

Example:例子:

I have an array A[] = {3, 1, 2, 4, 3}.我有一个数组 A[] = {3, 1, 2, 4, 3}。

If I split at index 1, left array is {3} and right array is {1, 2, 4, 3}.如果我在索引 1 处拆分,则左数组为 {3},右数组为 {1、2、4、3}。 The absolute difference is |(3) - (1 + 2 + 4 + 3)|绝对差是|(3) - (1 + 2 + 4 + 3)| = 7. = 7。

The smallest possible split is with index 3, where left array is {3, 1, 2} and right array is {4, 3} and the absolute difference is |(3 + 1 + 2) - (4 + 3)|最小可能的拆分是索引 3,其中左数组为 {3, 1, 2},右数组为 {4, 3},绝对差为 |(3 + 1 + 2) - (4 + 3)| = 1. = 1。

Here is my code:这是我的代码:

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;
    }
}

You probably need to give more information about the task, so we could try to figure your misstep. 您可能需要提供有关该任务的更多信息,因此我们可以尝试找出您的失误。 But, looking at the code I see 但是,看一下我看到的代码

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

From this, difference will always be equal to minValue ; 由此, difference将始终等于minValue difference < minValue fails. difference < minValue失败。

Minimize the value |(A[0] + ... + A[P-1]) - (A[P] + ... + A[N-1])|.最小化值|(A[0] + ... + A[P-1]) - (A[P] + ... + A[N-1])|。 The difference between the two parts is the value of: |(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])|。

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;
}

This Kotlin sample passed codility with 100% score这个 Kotlin 样本以 100% 的分数通过了 codility

    private fun tapeEquilibrium03(inputList: ArrayList<Int>): Int {
    var output = 0
    var leftSum = 0
    val sum = inputList.sum()
    for (i in 0 until inputList.size - 1) {
        leftSum += inputList[i]
        val resultPart = abs((sum - leftSum) - leftSum)
        if (i == 0) output = resultPart
        else if (resultPart < output) output = resultPart
    }
    return output
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM