【发布时间】:2016-07-29 02:31:31
【问题描述】:
我真的需要帮助来解决家庭作业问题。几天来我一直在努力解决这个问题,非常感谢您的帮助!提示如下:
将两个数组合并为一个。编写一个名为 merge 的方法,它需要 3 个整数数组 参数:a、b 和 soln。 soln 保证为 a.length + b.length 的大小。数组 a 和 b 应该通过交替元素“合并”成一个数组。添加第 4 个参数,它指示对于给定的方法递归调用应该更新 soln 中的哪个元素。
例子:
merge({1, 2, 3}, {4, 5, 6}, soln, 0) 应该以 soln 中的以下值结尾:{1, 4, 2, 5, 3, 6}
merge({1,2}, {3,4,5}, soln, 0) 应以 soln 中的以下值结尾:{1,3,2,4,5}
我可以让它与长度相同的数组一起工作,即使数组的长度不同(但只有一个元素)。我无法让索引正确排列。我已经尝试了许多不同的变体,但到目前为止,这是我所拥有的:
public static void merge3(int[] a, int[] b, int[] soln, int index) {
if (index > soln.length-1) {
return; //if index reaches end of soln length
}
int index2 = (int)(index/2); //allows me to pull alternately from a and b arrays. As index goes up, index2 becomes 0, 0, 1, 1, 2, 2, etc.
if (b.length >= a.length) {
if (index%2 == 0) {
if (index2 > a.length-1) {
soln[index] = b[index2];
merge3(a, b, soln, index+1);
} else {
soln[index] = a[index2];
merge3(a, b, soln, index+1);
}
} else {
soln[index] = b[index2];
merge3(a, b, soln, index+1);
}
} else if (b.length < a.length) {
if (index%2 == 0) {
soln[index] = a[index2];
merge3(a, b, soln, index+1);
} else {
if (index2 >= b.length) {
soln[index] = a[index2];
merge3(a, b, soln, index+1);
} else {
soln[index] = b[index2];
merge3(a, b, soln, index+1);
}
}
}
}
如果数组 a 是 {1, 2, 3},数组 b 是 {4, 5, 6, 7, 8, 9},则 soln 变为 {1, 4, 2, 5, 3, 6, 7, 7 , 8} 而不是应该是 {1, 4, 2, 5, 3, 6, 7, 8, 9}。它关闭了,因为当我执行 index + 1 时,递归调用捕获了相同的值 (index2),该值用于在只剩下一个数组时在数组之间交替。请帮忙!谢谢!
【问题讨论】:
-
是否需要递归调用?
-
鉴于这是作业;我的建议是写下如果你不得不用笔和纸来做这件事你会采取的步骤。这些将是您算法的步骤。
-
是的,我们需要使用递归调用。而且我已经做到了(交替,然后用剩下的填写soln)——理论上我很难实现!我已经想出了如何递归合并。但是当数组的长度相差超过 1 时,我无法弄清楚如何从正确的索引中绘制。
-
差异的大小应该是无关紧要的,如果它是 1 或 1000 则并不重要。您是否考虑过,一旦您点击了比其他数组更多的第一个元素,您只需从该元素复制到数组的末尾?
-
是的,但我不知道如何递归地从头到尾复制元素。 :( 使用 for 循环会很容易!但是如果我必须再次调用递归方法,一切都会被我的索引弄乱。(顺便说一句,谢谢你的帮助!)
标签: java arrays recursion merge