给定一组整数,是否可以将整数分成两组,这样一组的总和是10的倍数,另一组的总和是奇数。每个int必须在一个组或另一个组中。编写一个递归的helper方法,它接受你喜欢的任何参数,并从splitOdd10()初始调用你的递归帮助器。 (不需要循环。)
这是我的解决方案代码:(是的,我使用了两个辅助方法而不是一个) 这就是我试图解决问题的方法:(如果我做错了,请纠正我)。
nums
中的每个号码最终只会出现在其中一个组group1
或group2
中。对于这种情况,元素进入group1 - group1 += nums[start]
并以这种方式递归nums
中的每个元素,直到最后一个项目被传递 - 其中索引start
超出{的范围{1}} - nums
。完成此操作后,我们最终会在这种可能性树的所有分支的末尾有两个start >= nums.length
和group1
组{'然后检查是否发生了两个组,使得一个组的总和是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'。请帮助我理解为什么检查这两个条件是不正确的。
答案 0 :(得分:0)
嗯,算法上,这很容易。
给定一组整数,它们可以总结为奇数或偶数。
因此唯一可能的解决方案是总和已经是奇数的情况,并且将所有元素放入奇数桶中是有效的答案,因为0%10是0.
因此,您可以在第一步中将其拆分为一个空白部分,另一侧将整个部分拆分,或者它不可拆分。
更复杂的问题是找到两个总和或元素数最小差异的桶。