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

如果可能,请递归检查以将数组拆分为满足特定条件的两个数组

甄飞飙
2023-03-14

我正在通过CodingBat解决以下问题:

给定一个整数数组,是否可以将整数分成两组,使一组的和为10的倍数,另一组的和为奇数。每个int必须在一个组或另一个组中。编写一个递归助手方法,该方法接受您喜欢的任何参数,并从splitOdd10()对递归助手进行初始调用。(不需要循环。)

我在SO上找到了一篇文章,讨论了一个类似的话题:是否有可能将一个数组分成两个具有相等乘积的数组,并尝试通过类比编写代码。这是我迄今为止得到的(Java):

public boolean splitOdd10(int[] nums) {
    if (nums.length == 0)
    return false;
  else
    return canSplit(0, nums, 0);
}

private boolean canSplit(int first, int[] nums, int term) {
    if (first == nums.length - 1)
    return (term + nums[first]) % 10 == 0 || (term + nums[first]) % 2 == 1;
  else
    return canSplit(first + 1, nums, term + nums[first]);
}

但是在进一步思考代码后,我明白它只是检查原始数组作为一个整体的总和是10的倍数还是奇数。

我很难理解如何从n步进到n-1,以及绑定条件应该是什么,因为这两个数组彼此不依赖,不像它们的乘积相等。

有人能给我一个提示吗?谢谢

共有2个答案

柳联
2023-03-14

我会发布我自己的代码,我相信这更清楚一点(至少对我来说):

public boolean splitOdd10(int[] nums) {     
  if (nums.length == 0)
    return false;
  else
    return canSplit(0, nums, 0, 0);
}

private boolean canSplit(int index, int[] nums, int mod10Sum, int oddSum) {

  if (index == nums.length)
    return mod10Sum % 10 == 0 && oddSum % 2 == 1;
  else
    return canSplit(index + 1, nums, mod10Sum + nums[index], oddSum)
          || canSplit(index + 1, nums, mod10Sum, oddSum + nums[index]);
}
徐丰茂
2023-03-14

假设你必须分成两组(A和B)。对于每个元素,您有两个选择:您可以将当前元素放入组A或组B。

状态:mod10(A组模块10中所有元素的总和),odd2(B组模块2中所有元素的总和)

bool check(int arr[], int idx, int mod10, int odd2,  int size){ 

  if(idx == size){

     return (mod10 == 0 and odd2 == 1);
}

   // include current element in group A

  bool first_choice = check(arr, idx + 1, (mod10 + arr[idx]) % 10, odd2, size)

   // include  current element in group B

  bool second_choice = check(arr, idx + 1, mod10, (odd2 + arr[idx]) % 2, size)

  return (first_choice or second_choice);    
}

您可以将这些状态保存在表中,复杂度O(size*10*2)其中size=数组中的总元素

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

  • 问题内容: 我有一个具有以下结构的MySQL表: drinks_log(id,users_id,brinkles_id,时间戳) 我正在尝试计算用户(ID为1)每天至少记录5次饮料(ID为1)的连续几天的最大连胜纪录。我很确定可以使用以下视图来完成此操作: 但是,每次运行此检查时都为不同的用户重复创建视图似乎效率很低。MySQL中是否有一种方法可以在单个查询中执行此计算,而无需创建视图或多次重复调

  • 给定任务:“编写名为‘mysplit’的函数,该函数获取一个int数组并调用一个名为‘mysplit’的递归方法。函数mysplit需要检查当前数组是否可以分为以下两组: *每组的总和必须相等。 *每个数字在每个组中只出现一次(此子句旨在防止用户添加/复制数字,以获得两个组之间的相等值=第一个子句)。 *所有可以除以5的数字必须在同一组。 *所有能被3(而不是5)除以的数字必须在第二组中。 我已经

  • 通过循环每个资源的名称,查看分配给该人员姓名的帐户,随机选择一个,并用NA替换该人员的姓名,以减少资源分配。 可复制示例: 我到目前为止的进展: 我听说for循环是不必要的。我相信这可以通过purr包和pmap之类的东西来实现。我还在学习。 我想重复一下OwnerDF,看看那个人是否“拥有”了太多的账户。如果是,请查看原始帐户列表,随机选择一个,并将所有者的姓名替换为NA,从其计数中删除1,然后继

  • 给定一个数组大小,请检查是否可以将序列拆分为两个序列-和,以便第一个序列严格减少,第二个序列严格增加。 输入格式 第一行包含单个整数表示输入的大小。 下一个行包含单个整数,每个行表示数组的元素。 约束

  • 在PHP中,检查数组是否为递归数组的最佳方法是什么? 给定以下代码: 从PHP手册: print\u r()在到达数组的第三个元素时将显示递归。 似乎没有其他方法可以扫描数组中的递归引用,因此如果需要检查它们,则必须使用print\u r()及其第二个参数来捕获输出并查找单词RECURSION。 还有更优雅的检查方式吗? 附:这就是我如何使用regex和print\u r()检查和获取递归数组键的