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

如何编写一个递归布尔函数来查找数组是否可以从i到长度-1拆分为两个段和,使其等于diff

楚浩然
2023-03-14
public static boolean isSplitable(int[] arr, int diff, int i)

没有循环或辅助方法,我需要检查arr[i...arr.length-1]是否有一个等于diff的两段和,例如我有:diff=1, i=2, arr={3, 4, 1, 1, 2, 0, 1, 1, 3}它返回true,因为总和{1,1,2,0}(4)减去总和{1,1,3}(5)等于diff(1)。我试图想办法甚至没有循环的总和arr,我唯一想到的是将其添加到diff,但后来我失去了我原来的diff加上我不知道元素的数量,所以我可以在我的返回语句中添加“或”,所以现在我出主意了。

共有1个答案

洪高刚
2023-03-14

我假设您的限制是没有循环和库使用。您可能需要一些附加功能。此外,我假设差分检查应使用绝对值,即第一个和或第二个和是否较小无关紧要,只要差分匹配(-1或1)。话虽如此,第一种方法可能是这样的:

import org.junit.jupiter.api.Test;

import static java.util.Arrays.copyOfRange;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class RecursiveSplitTest {

  @Test
  public void testIsSplitable() {
    {
      int[] array = {3, 4, 1, 1, 2, 0, 1, 1, 3};
      assertTrue(isSplitable(array, 1, 2));
    }
    {
      int[] array = {3, 4, 1, 1, 1, 0, 4, 1, 3};
      assertTrue(isSplitable(array, 1, 4));
    }
    {
      int[] array = {3, 4, 1, 1, 1, 0, 4, 1, 3};
      assertFalse(isSplitable(array, 1, 7));
    }
    {
      int[] array = {3};
      assertFalse(isSplitable(array, 1, 1));
    }
  }

  public static boolean isSplitable(int[] array, int diff, int start) {
    if (start < 0 || start > array.length - 2) {
      System.out.println("Not possible due to initial parameters");
      return false;
    }

    return doSplitableRecursive(copyOfRange(array, start, array.length), diff, 0);
  }

  private static boolean doSplitableRecursive(int[] array, int diff, int start) {
    if (start + 1 >= array.length) {
      System.out.println("Could not find it");
      return false;
    }

    int[] left = copyOfRange(array, 0, start + 1);
    int[] right = copyOfRange(array, start + 1, array.length);

    int leftSum = sum(left, 0);
    int rightSum = sum(right, 0);
    System.out.println("leftSum: " + leftSum);
    System.out.println("rightSum: " + rightSum);

    if (leftSum + diff == rightSum || leftSum - diff == rightSum) {
      System.out.println("Found match for cut at start + " + (start + 1));
      return true;
    }

    return doSplitableRecursive(array, diff, start + 1);
  }

  private static int sum(int[] array, int current) {
    if (array.length == 0) {
      return current;
    }

    return sum(copyOfRange(array, 1, array.length), current + array[0]);
  }
}

关键是系统地将数组分为两部分,从一开始就检查每个部分的总和与差值。然后进一步剪切一个索引,如果不匹配,则重复该过程。最后,如果没有其他元素,则必须以false退出。边缘有点粗糙。请随时改进它并修复可能存在的错误。打印语句用于调试目的。当然,人们可能会争论JUnit和java。util。数组是库函数。如果需要的话,可以用一点额外的努力来代替这些。

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

  • 方法名称: 如果可以将数组拆分为两个,且值的总和相等,则返回true,例如: 不允许更改数组顺序,只允许递归不允许循环,私有方法也可以,只要是递归的。 我写的内容(代码不完整): 我想做的是:我使用一个私有方法来求整个数组的和,然后从总和中减去。主方法中假设逐步求和数组的和。我的问题是这个方法是布尔的,我不知道如何递归地使用布尔方法来完成它。 我的问题:你能告诉我结构是否好吗?我该怎么做?

  • 从一个布尔数组中找到第i个布尔值,例如:数组是{true, true, false, false, true},该方法将输出int,显示第3个true值,即4。 我已经尝试过一些代码,它可以工作,但我需要使用递归,而不是while函数。

  • 所以问题是,你有一个整数列表,你必须找到列表中的任何两个和是否为负。 现在我有这个 我的代码的问题是它只检查列表中的前两个。所以在一个列表中,[-10,15,30,-5]当它应该为真时,你会得到假,因为-5-10是一个负和。我的功能只检查: -10 15 15 30 30 - 5 我怎样才能得到它,让它使用递归检查-10-30、-10-5和15-5? 编辑,我忘了提一下,只允许使用len()[]和

  • 问题内容: 我知道我可以这样做: 然后只需编写语句中所需的代码。 还有其他方法可以检查它们是否相等? 问题答案: 怎么了 if(!Arrays.equals(array1,array2)) 与相同,即是同一数组。这不是大多数人期望的。 比较数组的内容。

  • 该函数获取一个整数和一个数字,如果该数字在整数中出现偶数次,则返回true,否则返回false。 例如: 如果 和 ,则该函数应返回 。 如果 和 ,则该函数应返回 。 这是我到目前为止得到的,我被卡住了……这是家庭作业,所以请不要写答案,而是提示我并帮助我自己完成。