当前位置: 首页 > 知识库问答 >
问题:

给定一个数组,如果可以递归地将其拆分为两个相等的组,则返回true

欧阳博文
2023-03-14

方法名称:

public static boolean equalSplit (int[] a) 

如果可以将数组拆分为两个,且值的总和相等,则返回true,例如:

{-3,5,12,14,-9,13} // returns true -3+5+14 = 12+(-9)+13
{-3,5,-12,14,-9,13}; //return false,you can split it to two groups but the groups won`t be equal 3+5+14+(-12)=-9+13 
{-3,5,12,14,-9}; // false because can`t split the array to two

不允许更改数组顺序,只允许递归不允许循环,私有方法也可以,只要是递归的。

我写的内容(代码不完整):

public class Rec
{
    // private method to find total sum of an array.
    static int findSum(int A[], int N)
    {
        if (N <= 0)
            return 0;
        return (findSum(A, N - 1) + A[N - 1]);
    }    

    
    //
    public static boolean equalSplit (int[] a)
    {
      return(equalSplit(a,0,0));   
    }
    
    // override
    private static boolean equalSplit (int[] a,int sum,int i) 
    {
        int totalSum = findSum(a,a.length); // total sum of the given array.
        if(i > a.length) // run until reach the end of the array.
            return false;
        if(totalSum - sum == sum) // if subtracting the recursive sum from total sum gives equal number return true
            return true;
   
        int take = equalSplit(a,sum + a[i] , i+1); // boolean cannot be convereted to int
    }    
}

我想做的是:我使用一个私有方法来求整个数组的和,然后从总和中减去。主方法中假设逐步求和数组的和。我的问题是这个方法是布尔的,我不知道如何递归地使用布尔方法来完成它。

我的问题:你能告诉我结构是否好吗?我该怎么做?

共有1个答案

侯令雪
2023-03-14

这是一个不使用循环、不改变顺序的解决方案,

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

我对这个问题的看法是,

第一步-

步骤2-

第三步-

步骤4-

说明:

>

  • 创建两个新的整数数组,只有当给定的数组可以被分成两个相等的部分时,才会被填充。这里是arrAarrB

    检查给定数组的长度是否可以被2除,并且是否有0个余数,因为这可以回答“此数组可以被分成两个相等的部分吗?”。这个答案中的代码是arr.length%2==0。如果给定数组仅满足此条件,则将执行下面给出的步骤,否则将返回false。

    初始化两个整数变量以存储两个等分数组的Sum值。

    初始化两个新创建的数组,数组长度为给定数组的一半,即arr.length/2

    然后将给定数组元素的前半部分复制到第一个新初始化的数组中,然后将第二部分复制到第二个数组中。为了实现这个createArray(int[]arr,int index,int[]copyFrom,int copyFromIndex)方法被使用。arr是传递应复制到的数组的参数,索引应为0,因为它用作新创建数组的索引,copyFrom是包含所有元素的给定数组的参数,copyFromIndex用于开始从给定索引复制元素。

    然后使用递归函数计算总和,并将其存储在之前创建的单独变量中。这里使用的函数是arraySum(int[]arr, int N)

    返回两个总和变量是否相等。

  •  类似资料:
    • 我正在通过CodingBat解决以下问题: 给定一个整数数组,是否可以将整数分成两组,使一组的和为10的倍数,另一组的和为奇数。每个int必须在一个组或另一个组中。编写一个递归助手方法,该方法接受您喜欢的任何参数,并从splitOdd10()对递归助手进行初始调用。(不需要循环。) 我在SO上找到了一篇文章,讨论了一个类似的话题:是否有可能将一个数组分成两个具有相等乘积的数组,并尝试通过类比编写代

    • 我想检查是否可以将一个数组拆分为具有相同和的连续子数组。拆分数组还意味着删除数组的边框元素。 例如,要将其拆分为3个部分,我们需要删除到元素 通过删除这2个元素,就有3个相同和的连续子数组,和。 因此,如果可以将数组拆分为3个部分(等和)并删除它们之间的边界,则应返回true,否则应返回false。 返回的示例是。因为删除2个元素后,它将有4个元素,这些元素不能分组为3个相等的和 我不知道如何处理

    • 我有一个PHP数组,其中包含一组用户。每个用户都属于一个团队。阵列将如下所示。 $Array=Array('User1','User2','User3','User4','User5'); 我需要得出以下逻辑。 如果“User1”和“User2”属于同一个名为“Team1”的团队,而其他用户拥有单独的唯一团队,则应按如下所示对阵列重新排序。 $Array=Array('User1','User3'

    • 给定一个数字数组,查找是否有方法从数组中删除/移除一个数字,并在数组中进行一个分区(将数组划分为两个子数组),以使子数组1中的元素和等于子数组2中的元素和。 现在让我们考虑一个例子:- 现在一个类似的问题已经存在,我们只需要,找到是否数组可以被分成两个子数组相等的和,可以在O(n) =中完成 伪代码:-有效的解决方案包括提前计算阵列中所有元素的总和。然后,对于数组中的每个元素,我们可以通过使用数组

    • 问题内容: 当每个块的总和大致相等时,如何将数组分成两个块? 问题答案: 像这样: 测试:

    • 问题内容: 想象一下,我有一个这样的JS数组: 我想要的是将该数组拆分为N个较小的数组。例如: 对于Python,我有这个: 对于JS,我可以提出的最佳解决方案是递归函数,但我不喜欢它,因为它既复杂又丑陋。这个内部函数返回一个像这样的数组[1,2,3,null,4,5,6,null,7,8],然后我必须再次循环并手动拆分它。(我的第一次尝试是返回此:[1、2、3,[4、5、6,[7、8、9]]],