返回信息流合并两个有序数组 力扣(88)
我的答案是这样的
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] result = new int[m + n];
int j = 0;
int k = 0;
for (int i = 0; i < m + n; i++) {
if (k == n) {
result[i] = nums1[j++];
continue;
}
if (j == m) {
result[i] = nums2[k++];
continue;
}
if (nums1[j] < nums2[k]) {
result[i] = nums1[j++];
} else {
result[i] = nums2[k++];
}
}
for (int i = 0; i < m + n; i++) {
nums1[i] = result[i];
}
//如果采用下面这种赋值方式,力扣就会判定编译不过,不过我觉得力扣的答案解析出错了
//nums1 = result;
}
我想问下,是不是力扣错了呢?
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #100352同步于 2022/1/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
求教一个力扣的问题
nijian81
2022/1/17镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 a349101311 的大作中提到: 】
: result作用域仅存在于merge函数 main函数调用结束result内存被回收 nums1指向空地址 当然报错
但是力扣给的错误提示不是null,
而是nums原来的内容。
按照你的说法,应该提示null才对
nums原来的内容?
【 在 nijian81 的大作中提到: 】
:
: 但是力扣给的错误提示不是null,
: 而是nums原来的内容。
: ............
那给的报错信息是啥
【 在 nijian81 的大作中提到: 】
:
: 但是力扣给的错误提示不是null,
: 而是nums原来的内容。
: ............
【 在 nijian81 的大作中提到: 】
: 但是力扣给的错误提示不是null,
: 而是nums原来的内容。
: 按照你的说法,应该提示null才对
给nums赋值result是不起作用的,就像你在这儿改m和n的值外面也看不到一样
五楼正解 你可以去好好看看java数组作为函数传递时的原理 你直接改变数组元素会改变真实地址的元素但是直接把它赋值为另一个数组是是不会改变原地址的内容的
【 在 Beegerous 的大作中提到: 】
:
: 给nums赋值result是不起作用的,就像你在这儿改m和n的值外面也看不到一样
【 在 clara1016 的大作中提到: 】
: nums原来的内容?
力扣提示如下:
输入:
[1,2,3,0,0,0]
3
[2,5,6]
3
输出:
[1,2,3,0,0,0]
预期结果:
[1,2,2,3,5,6]
我的代码:
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] result = new int[m + n];
int j = 0;
int k = 0;
for (int i = 0; i < m + n; i++) {
if (k == n) {
result[i] = nums1[j++];
continue;
}
if (j == m) {
result[i] = nums2[k++];
continue;
}
if (nums1[j] < nums2[k]) {
result[i] = nums1[j++];
} else {
result[i] = nums2[k++];
}
}
// for (int i = 0; i < m + n; i++) {
// nums1[i] = result[i];
// }
//如果采用下面这种赋值方式,力扣就会判定编译不过,因为力扣服务器检测的结果是
//nums1数组的内存地址里面的内容,如果单单改变nums1引用的地址,是不可以的。
//因为这样并没有改变nums1原来的内存地址所对应的内容
nums1 = result;
}
【 在 a349101311 的大作中提到: 】
: 五楼正解 你可以去好好看看java数组作为函数传递时的原理 你直接改变数组元素会改变真实地址的元素但是直接把它赋值为另一个数组是是不会改变原地址的内容的
你这么解释,我好像明白了。。