给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。
初始化 A 和 B 的元素数量分别为 m 和 n。
示例:
输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
来源:力扣
因为在写这个题目的时候,我本来想的是将两个数组用双指针的办法去排序,存放进一个新数组中,再重新给A数组赋值,但是在main方法中输出A数组,发现A数组的值并没有改变,所以我对java中函数的调用这个功能产生了困惑,特此记录一下,再写上解题思路。
这个要从函数的调用讲起,我这看了一篇博客,讲的十分详细:
函数的调用
我这里就用新写的demo来举例吧:
class test
中有要被调用的函数:test
public class test {
public void test(int[] a) {
int[] b = new int[a.length];
for(int i = 0; i < a.length; i++) {
b[i] = 1;
}
a = new int[b.length];
a = b;
}
}
在Damo中有个main,是执行的函数
public class Demo {
public static void main(String[] args) {
int[] a = new int[] { 1, 2, 3 };
new test().test(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
}
}
}
接着我用图讲解一下函数执行过程中内存的变化。
JVM自动寻找main函数,读取第一行代码,指针11111指向堆内存里面创建的一个对象:
然后读取第二行,是调用一个函数,将a作为传参值传入该函数中:
但是再执行test函数的时候,产生了一个新变量赋值,得到结果,再将传入的指向i的指针指向了那个新变量
函数调用结束,释放内存:
所以重新赋值的被传入参数并不能改变参数原有的指针指向,这就是为什么我第一个思路错误的原因。
所以只能对原A数组进行更改,才能在main函数调用后,A的数组会随之改变得到我们想要的值。
可以考虑从数组最后面开始互相比较,以此更改数组A。
public class Merge {
public void merge(int[] A, int m, int[] B, int n) {
while (m > 0 && n > 0) {
if(A[m - 1] > B[n - 1]) {
A[m + n - 1] = A[m - 1];
m--;
}
else {
A[m + n - 1] = B[n - 1];
n--;
}
while (n > 0) {
A[n - 1] = B[n - 1];
n--;
}
}
}
}