【发布时间】:2016-05-30 08:26:32
【问题描述】:
作为考试准备的一部分,我一直在努力解决我试图解决的问题,我想我可以使用你的帮助。 我需要编写一个布尔方法,该方法采用整数(正数和负数)数组,如果数组可以拆分为两个 equals 组,则返回 true,即每个组的数字的数量等于其他组。 例如,对于这个数组:
int[]arr = {-3, 5, 12, 14, -9, 13};
该方法将返回 true,因为 -3 + 5 + 14 = 12 + -9 + 13。
对于这个数组:
int[]arr = {-3, 5, -12, 14, -9, 13};
该方法将返回 false,因为即使 -3 + 5 + 14 + -12 = -9 + 13,等式两边的数字数量也不相等。
对于数组:
int[]arr = {-3, 5, -12, 14, -9};
由于数组长度不均匀,该方法将返回 false。
方法必须是递归的,允许重载,每个辅助方法也必须是递归的,我不用担心复杂度。
我已经尝试解决这个问题三个小时,我什至没有代码可以显示,因为我所做的所有事情都远未解决。
如果有人至少能给我一些伪代码,那就太好了。
非常感谢!
【问题讨论】:
-
我认为你的例子有一个错误——你的意思是
5而不是15在arr的第一个定义中? -
提示:如果所有数字的交叉和不能被2整除,那么当所有个数字为积极的。 IE。 1+2+3+4+5+6 的交叉和为 21,因此您不能将其分成 2 组。但是 1,2,3,4,5,7 有 22 个,即 2+4+5 = 1+3+7。因此,作为第一步,您可以测试所有数字是否都是正数,如果是,请检查交叉和。 (我不确定这是否是一个聪明的方法,也许递归会以更好的方式解决它,从臀部拍摄)。
-
是否有任何要求在 O(whatever) 中运行或者它只需要工作并且是递归的?
-
哦,数组最长有多长?因为暴力破解和测试每种组合可能需要很长时间。
-
你可以通过暴力破解它,只需说每个数字必须在等式的左边或右边;保留等式两边的数字的总和和计数,并在递归的每一步更新“左”或“右”数字对。它是 O(2^n),但这对于您给出的输入来说很小。