问题是“给定一组int,是否可以将整数分成两组,这样一组的总和是10的倍数,另一组的总和是奇数。每个int必须编写一个递归的辅助方法,它接受你喜欢的任何参数,并从splitOdd10()初始调用你的递归助手。(不需要循环。)“
我有一个正确的解决方案,但我的所有返回值都与正确的相反。修复它的hacky方法只是在结尾处切换布尔值,但我想知道我在概念上犯了什么错误。
public boolean splitOdd10(int[] nums) {
if (nums.length==0) return false;
//Should not have the ! operator
return (!splitOdd10(nums,0,1));
}
public Boolean splitOdd10(int[] nums, int lowerBound,int upperBound) {
int split10Sum=getSum(nums,lowerBound,upperBound);
int splitOddSum=getSum(nums)-split10Sum;
if (split10Sum % 10 == 0 && splitOddSum % 2 == 0) return true;
if (upperBound < nums.length) {
if (splitOdd10(nums,lowerBound,upperBound+1)) return true;
if (splitOdd10(nums,lowerBound+1,upperBound+1)) return true;
}
if (lowerBound < upperBound)
if (splitOdd10(nums,lowerBound+1,upperBound)) return true;
return false;
}
public int getSum(int[] nums) {
return getSum(nums,0,nums.length);
}
public int getSum(int[] nums, int lowerBound, int upperBound) {
if (lowerBound == upperBound) return 0;
return nums[lowerBound]+getSum(nums,lowerBound+1,upperBound);
}
答案 0 :(得分:2)
你的答案中有两点需要注意:
splitOdd10(new int[] {10, 1, 10, })
将返回false,而不是true。splitOdd10(int[] nums, int lowerBound,int upperBound)
可被10整除,并且10Sum
可被2整除,则rest
方法返回true,即如果它是偶数,则不是奇数。 具体而言。第二点:
if (split10Sum % 10 == 0 && splitOddSum % 2 == 0) return true;
应该是
if (split10Sum % 10 == 0 && splitOddSum % 2 == 1) return true;
第一点可能没问题,这取决于你要解决的问题,即如果你需要将数组“拆分”成两部分,那么它会起作用,但可能会产生太多的误报。具体来说,您需要考虑以下数组的答案应该是什么:
[10, 10, 1]
[1, 10, 10]
[1, 10, 2]
[1, 2, 10]
[10, 1, 10]
[10, 1, 2]