Метод, не получающий целочисленный массив, должен быть: - PullRequest
0 голосов
/ 08 мая 2020

У меня есть задание, в котором моему методу передается массив целых чисел, я что-то делаю с ними, а затем рекурсивно вызываю метод для подмножества массива, возвращаемого, когда массив имеет длину 2.

Это кажется, что перед рекурсивной передачей моему методу подмассив arr имеет значение [1,2], но после вызова метод, похоже, получил некоторый массив [9,8,2,4,6,3,5 , 1,7] Может ли это быть переполнение? Понятия не имею, что происходит между печатью и звонком. Спасибо!

Вывод:

array gotten: [1,2,3,4,5] of length: 5
init. should be 0, leftSum: 0 rightSum: 0
Original sums: leftSum: 3 rightSum: 12
Current differnece: 9
Next run: leftSum: 6 rightSum: 9
Current differnece: 3
Next run: leftSum: 10 rightSum: 5
newDiff: 5 greater than current diff: 3
Final sums: leftSum: 6 rightSum: 9
new Fruit Sum: 6
Current array: [1,2,3,4,5] passing subset: [1,2,3] of length: 3


array gotten: [1,2,3] of length: 3
init. should be 0, leftSum: 0 rightSum: 0
Original sums: leftSum: 1 rightSum: 5
Current differnece: 4
Next run: leftSum: 3 rightSum: 3
Current differnece: 0
Next run: leftSum: 6 rightSum: 0
newDiff: 6 greater than current diff: 0
Final sums: leftSum: 3 rightSum: 3
new Fruit Sum: 9
Current array: [1,2,3] passing subset: [1,2] of length: 2


array gotten: [9,8,2,4,6,3,5,1,7] of length: 9
init. should be 0, leftSum: 0 rightSum: 0
Original sums: leftSum: 23 rightSum: 22
Current differnece: 1
Next run: leftSum: 19 rightSum: 18
newDiff: 1 greater than current diff: 1
Final sums: leftSum: 23 rightSum: 22
new Fruit Sum: 22
 passing right side: [6,3,5,1,7] of length: 5


array gotten: [6,3,5,1,7] of length: 5
init. should be 0, leftSum: 0 rightSum: 0
Original sums: leftSum: 9 rightSum: 13
Current differnece: 4
Next run: leftSum: 14 rightSum: 8
newDiff: 6 greater than current diff: 4
Final sums: leftSum: 9 rightSum: 13
new Fruit Sum: 31
Current array: [6,3,5,1,7] passing subset: [6,3] of length: 2


Optimal amount of fruits: 34
Completed in 0 milliseconds

Process finished with exit code 0

Класс здесь:

import java.util.Arrays;

public class Assignment3 {

    static int curMinDifference;
    static int fruitCount;
    static boolean done;
    static int leftSum;
    static int rightSum;
    public int maxFruitCount (int[] sections) {
        fruitCount = 0;
        // Implement your dynamic programming algorithm here
        // You may use helper functions as needed
        fruitCount = playGame(sections);

        return fruitCount;
    }


    public static int playGame(int[] curSections) {
        if (curSections.length == 2) {
            fruitCount += min(curSections[0],curSections[1]);
            return fruitCount;
        }
        System.out.print("array gotten: ");
        printArray(curSections);
        System.out.print( " of length: " + curSections.length);
        int middle = curSections.length/2;
        curMinDifference = 2147483647;
        leftSum = 0;
        rightSum = 0;
        int tempL;
        int tempR;
        done = false;
        System.out.println("\ninit. should be 0, leftSum: " + leftSum + " rightSum: " + rightSum);
        findOriginalSums(curSections, middle);
        tempL = leftSum;
        tempR = rightSum;
        System.out.println("Original sums: leftSum: " + leftSum + " rightSum: " + rightSum);
        updateDifference(leftSum, rightSum);

        while(!done) {
            if (min(leftSum, rightSum) == leftSum) {
                tempL += curSections[middle];
                tempR -= curSections[middle];
                System.out.println("Next run: leftSum: " + tempL + " rightSum: " + tempR);
                updateDifference(tempL, tempR);
                if (!done) {
                    leftSum = tempL;
                    rightSum = tempR;
                    middle++;
                }
            } else if (min(leftSum, rightSum) == rightSum) {
                tempL -= curSections[middle - 1];
                tempR -= curSections[middle - 1];
                System.out.println("Next run: leftSum: " + tempL + " rightSum: " + tempR);
                updateDifference(tempL, tempR);
                if (!done) {
                    leftSum = tempL;
                    rightSum = tempR;
                    middle--;
                }
            }

        }

        System.out.println("Final sums: leftSum: " + leftSum + " rightSum: " + rightSum);
        fruitCount += min(leftSum,rightSum);
        System.out.println("new Fruit Sum: " + fruitCount );

        if(min(leftSum, rightSum) == leftSum){
            System.out.print("Current array: ");
            printArray(curSections);
            int[] arr = Arrays.copyOfRange(curSections,0,middle);
            System.out.print(" passing subset: ");
            printArray(arr);
            System.out.println(" of length: " + arr.length);
            System.out.println("\n");
                return playGame(arr);
        } else {
            int[] a = Arrays.copyOfRange(curSections,middle,curSections.length);
            System.out.print(" passing right side: ");
            printArray(a);
            System.out.println(" of length: " + a.length);
            System.out.println("\n");
            return playGame(a);
        }
    }

    private static void printArray(int[] curSections) {
        System.out.print("[");
        for(int j=0; j<curSections.length; j++) {
            System.out.print(curSections[j] );
            if(j != curSections.length-1){System.out.print(",");}
        }
        System.out.print("]");
    }


    private static void updateDifference(int leftSum, int rightSum) {
        if(differenceOf(leftSum,rightSum) < curMinDifference){
            curMinDifference = differenceOf(leftSum, rightSum);
            System.out.println("Current differnece: " + curMinDifference);
        } else{
            System.out.println("newDiff: " + differenceOf(leftSum,rightSum) + " greater than current diff: " + curMinDifference);
            done = true;
        }
    }

    private static int differenceOf(int leftSum, int rightSum) {
        if(leftSum < rightSum){
            return rightSum-leftSum;
        } else{
            return leftSum-rightSum;
        }
    }

    private static void findOriginalSums(int[] curSections, int middle) {
        for(int i=0; i<middle; i++){
            Assignment3.leftSum += curSections[i];
        }
        for(int i=middle; i<curSections.length; i++){
            Assignment3.rightSum += curSections[i];
        }
    }

    private static int min(int a, int b) {
        if(a<b){
            return a;
        }else {
            return b;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...