这是一个不使用循环的解决方案,
static int[] arrA, arrB;
public static boolean equalSplit(int[] arr) {
//Step 1
if (arr.length % 2 == 0) {
int sumA = 0, sumB = 0; // Two int variables to store the value of sum.
// Initializing the two new arrays with equal length.
arrA = new int[arr.length / 2];
arrB = new int[arr.length / 2];
// Copying the elements from the given array to the new arrays.
arrA = createArray(arrA, 0, arr, 0);
arrB = createArray(arrB, 0, arr, arr.length / 2);
//Calculating and storing the sum in the variables.
sumA = arraySum(arrA, arrA.length);
sumB = arraySum(arrB, arrB.length);
return sumA == sumB; // Checking the codition
} else {
return false;
}
}
private static int[] createArray(int[] arr, int index, int[] copyFrom, int copyFromIndex) {
if(index == arr.length) return arr;
arr[index] = copyFrom[copyFromIndex];
index++;
copyFromIndex++;
return createArray(arr, index, copyFrom, copyFromIndex);
}
private static int arraySum(int[] arr, int N) {
if (N <= 0) return 0;
return (arraySum(arr, N - 1) + arr[N - 1]);
}
我对这个问题的态度是,
第 1 步 -> 检查是否可以将给定数组拆分为两个相等的数组。如果是,接下来是第 2 步,或者返回 false 而不进行任何进一步的步骤。
第 2 步 -> 使用递归将给定的数组元素复制到两个不同但相等的数组中。
第 3 步 -> 对新填充的两个数组求和并将其存储在两个不同的变量中。
第 4 步 -> 如果两个新填充的数组的总和相等,则函数返回 true,否则返回 false。
解释 :
创建两个新的整数数组,只有当给定的数组可以分成两个相等的部分时才会填充它们。这里是 arrA 和 arrB。
检查给定数组的长度是否可以被 2 整除并且余数为 0,因为这可以回答“这个数组可以分成两个相等的部分吗?”的问题。此答案中的代码是 arr.length % 2 == 0。如果给定的数组仅满足此条件,则将执行下面给出的步骤,否则它将返回 false。
初始化两个整数变量以存储两个等分数组的 Sum 的值。
初始化两个新创建的数组,数组长度为给定数组的一半,即arr.length / 2
.
然后将给定数组元素的前半部分复制到第一个新初始化的数组,然后将后半部分复制到第二个数组。实现这个createArray(int[] arr, int index, int[] copyFrom, int copyFromIndex)
方法是用的。arr 是传递要复制到的数组的参数,index 应该为 0,因为它用作新创建的数组的索引,copyFrom 是给定数组的参数,其中包含所有元素,copyFromIndex 用于开始复制给定索引中的元素。
然后使用递归函数计算总和并将其存储在之前创建的单独变量中。这里使用的函数是arraySum(int[] arr, int N)
.
返回两个总和变量是否相等。