为什么检查多个条件会返回不正确的结果

时间:2018-03-03 10:02:47

标签: java recursion

给定一组整数,是否可以将整数分成两组,这样一组的总和是10的倍数,另一组的总和是奇数。每个int必须在一个组或另一个组中。编写一个递归的helper方法,它接受你喜欢的任何参数,并从splitOdd10()初始调用你的递归帮助器。 (不需要循环。)

这是我的解决方案代码:(是的,我使用了两个辅助方法而不是一个) 这就是我试图解决问题的方法:(如果我做错了,请纠正我)。

nums中的每个号码最终只会出现在其中一个组group1group2中。对于这种情况,元素进入group1 - group1 += nums[start]并以这种方式递归nums中的每个元素,直到最后一个项目被传递 - 其中索引start超出{的范围{1}} - nums。完成此操作后,我们最终会在这种可能性树的所有分支的末尾有两个start >= nums.lengthgroup1组{'然后检查是否发生了两个组,使得一个组的总和是10的倍数,而其他总和是group2

我认为这是我的代码行为不端的地方 - 在致电compare(group1, group2)时。我尝试compare(group1,group2)是10的倍数而group1是奇数 - group 2然后,因为我们不知道发生了相反的情况,if( a%10 == 0 && b%2 == 1) return true;结果是奇怪的是group1是10的倍数,我也会检查group2这对所有情况都不起作用。Here is a screenshot of code output in codingbat.com。但是评论if( a%2 == 1 && b%10 == 0 ) return true;的第一个条件却神奇地修复了它。Here is a working code

compare(group1,group2

我的问题是:我们如何"知道"哪个组检查是奇数,哪个检查是10的倍数?我检查了两个组的两个条件,但显然这是错误的,并且没有为某些数组返回正确的结果。例如,它返回' true'对于数组[10,0,5,5]而不是' false'。请帮助我理解为什么检查这两个条件是不正确的。

1 个答案:

答案 0 :(得分:0)

嗯,算法上,这很容易。

给定一组整数,它们可以总结为奇数或偶数。

  • 如果它们总和为奇数,则可能的一个拆分是将所有数字返回到sumIsOdd-bucket,而sumMod10-bucket保持为空。
  • 如果它们总和为10的倍数,这是偶数和的一个特例,一个有效的解决方案是将它们全部排序到sumIsMod10-bucket中,而奇数桶保持为空。但奇怪的桶,如空,不能总结为奇数,所以这不是解决方案,而是失败。
  • 第三种可能性是,总和是偶数,但不能被10整除,那么无论我们多少次从总和中减去10,(甚至没有检查,如果某些数字加起来这样的总和),其余的总和既不会变为奇数,也不会被10整除。示例:36→26→16→6 - 没有休息是奇数,也不会被10整除。
  • 最后一种可能性是,我们减去偶数和,它本身不能被10整除,是一个偶数的和,并把它放入奇数桶中。但是,即使我们在另一个桶中达到可分为10的总和,奇数桶也将是均匀的并且也是失败的。示例:(100,1)可以分为(1)(100),但(101)()也是一个解决方案。

因此唯一可能的解决方案是总和已经是奇数的情况,并且将所有元素放入奇数桶中是有效的答案,因为0%10是0.

因此,您可以在第一步中将其拆分为一个空白部分,另一侧将整个部分拆分,或者它不可拆分。

更复杂的问题是找到两个总和或元素数最小差异的桶。