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

使用递归,根据特定的a条件将数组分为2组

孔海超
2023-03-14

给定任务:“编写名为‘mysplit’的函数,该函数获取一个int数组并调用一个名为‘mysplit’的递归方法。函数mysplit需要检查当前数组是否可以分为以下两组:

*每组的总和必须相等。

*每个数字在每个组中只出现一次(此子句旨在防止用户添加/复制数字,以获得两个组之间的相等值=第一个子句)。

*所有可以除以5的数字必须在同一组。

*所有能被3(而不是5)除以的数字必须在第二组中。

我已经写了这段代码,但已经走到了死胡同。我未能完成任务的前2条,无法想出将其插入代码的方法。

这是我编写的代码:

public static boolean mySplit(int[] nums)
{
    return MySplit(nums,0,0,0);
}

public static boolean MySplit(int[]arr,int result_5,int result_3,int pointer)//2 groups: 'result_5' & 'result_3' and pointer to iterate through an array
{
    if(arr[pointer]%5==0)
    {
        return MySplit(arr,result_5+arr[pointer],result_3,pointer++);
    }
    else if(arr[pointer]%3==0)
    {
        return MySplit(arr,result_5,result_3+arr[pointer],pointer++);
    }

}

*编辑:**示例:

mySplit([1,1])==

mySplit([1,1,1])==

mySplit([2,4,2])==

mySplit([5,21,8,15,7])==

MySplit([15,10,5])==

MySplit([15,8,7])==

共有2个答案

越望
2023-03-14

这是我想出的:

public static void main(String[] args)
{
    System.out.println(mySplit(new int[] { 1, 1 })); // ==>true

    System.out.println(mySplit(new int[] { 1, 1, 1 })); // ==>false

    System.out.println(mySplit(new int[] { 2, 4, 2 })); // ==>true

    System.out.println(mySplit(new int[] { 5, 21, 8, 15, 7 })); // ==>true

    System.out.println(mySplit(new int[] { 15, 10, 5 })); // ==>false

    System.out.println(mySplit(new int[] { 15, 8, 7 })); // ==>true
}

public static boolean mySplit(int[] nums)
{
    if (nums.length == 0)
        return false;

    return mySplit(nums, 0, 0, 0);
}

private static boolean mySplit(int[] nums, int i, int groupA, int groupB)
{
    if (i == nums.length)
        return groupA == groupB; // At the end, check if the sum of each group is equal.

    if (nums[i] % 5 == 0)
        return mySplit(nums, i + 1, groupA + nums[i], groupB); // All the numbers that can be divided by 5 must be in the same group (Group A).

    if (nums[i] % 3 == 0 && nums[i] % 5 != 0)
        return mySplit(nums, i + 1, groupA, groupB + nums[i]); // All the numbers that can be divided by 3 (and not by 5) must be in the second group (Group B).

    return mySplit(nums, i + 1, groupA + nums[i], groupB) || mySplit(nums, i + 1, groupA, groupB + nums[i]);
}
欧阳睿范
2023-03-14

注意注释。如果需要进一步澄清,请立即询问:

public static void main(String[] args) {

    System.out.println(mySplit(1,1));           //true
    System.out.println(mySplit(1,1,1));         //false
    System.out.println(mySplit(2,4,2));         //true
    System.out.println(mySplit(5,21,8,15,7));   //true
    System.out.println(mySplit(15,0,5));        //false
    System.out.println(mySplit(15,8,7));        //true
}

public static boolean mySplit(int...nums)
{
    List<Integer> groupA = new ArrayList<>(); //initialized by all numbers divided by 5
    List<Integer> groupB = new ArrayList<>(); //initialized by all other numbers divided by 3
    List<Integer> groupC = new ArrayList<>(); //initialized by all other numbers

    for(int number : nums) {
        if((number % 5) == 0 ) {
            groupA.add(number);
        }else if ((number % 3) == 0 ) {
            groupB.add(number);
        }else {
            groupC.add(number);
        }
    }

    return mySplit(groupA, groupB, groupC);
}

private static boolean mySplit(List<Integer> groupA, List<Integer> groupB, List<Integer> groupC) {

    if(groupC.size() == 0 ) { //no more numbers to add
        return  sumList(groupA) == sumList(groupB);
    }

    int next = groupC.get(0);
    groupC.remove(0);

    //make a new group A which includes next 
    List<Integer> newGroupA = new ArrayList<>(groupA);
    newGroupA.add(next);

    //make a new group B which includes next 
    List<Integer> newGroupB = new ArrayList<>(groupB);
    newGroupB.add(next);

    //check with new A and B. Make a defensive copy of groupC 
    //to prevent changes in groupC 
    if( mySplit(newGroupA, groupB, new ArrayList(groupC))) {

        return true;
    //check with A and new B
    }else if( mySplit(groupA, newGroupB, new ArrayList(groupC))) {

        return true;
    }

    return false; //equality not found 
}

//sum a list 
private static int sumList(List<Integer> list) {

    /* a pre java 8 version
        int sum = 0;
        for( int i : list ) {  sum += i;}
        return sum;
    */
    return list.stream().mapToInt(Integer::intValue).sum();
}

您可以将mySplit(int…nums)的签名更改为mySplit(int[]nums)并通过mySplit(new int[]{2,4,2})调用它

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

  • 问题内容: 我有一张地图,如下所示: 如您所见,将有一个名为split的最终常量,其值为40 我必须实现逻辑,例如,如果映射的值达到40,那么从计算开始的映射的第一个键以及恰好达到40的键也将被选择为min和max,如上所述。 。 除此之外,如果总和超过40,则需要格外小心。如果是,我们必须忽略它,并且在最小值和最大值相等的情况下,将先前的值本身作为最小值和最大值。 请建议我如何使用Java和。乡

  • 我在这个递归练习中遇到了一个问题。 练习是测试字符数组是否只有大写或小写,然后才返回true;否则,如果同时存在小写和大写字母,则返回false。 下面的代码总是返回true。 我试着在每次有大信号或小信号时都计算一个变量,然后如果数量等于数组,那么它是真的,否则它不是真的;但它没有给我这个。这是一个布尔函数,调用递归并没有给出变量的数量。 守则:

  • ,该数组是一维数组,第一层节点是parent:# 第二层根据第一层id和 第二层parent进行比较,以此类推

  • 我想知道我可以在给定的数组中计算2条特定路径吗。 > < li> 如何返回从[0][0]到[m][n]的最短(或最长)路径?我设法递归地遍历数组,但是我不知道如何“保存”路径并检查哪一个返回的路径更小。 第二个请求是一个我已经纠结了很长时间的问题,但我看到了关于使用和计算这些数组中的值的其他问题。

  • 编写一个名为mySplit的函数,该函数接受int数组,并调用递归引用函数。函数MySplit应该检查数组中的数字是否可以分为2组, > 不要忽略或添加第一个数组中的数字 所有5的倍数必须在同一组中。 所有3的重复数(而不是5的倍数)必须在第二组中。 我开始写代码,但我正在寻找一些不同的想法。所有内容都应该写在递归函数中,布尔函数应该只返回true或false 示例: 我的代码: