练习leetcode 189 题目时出现的问题
public static void rotate(int[] nums, int k) {
if (nums == null || nums.length < 1 || k < 1) {
return;
}
int len = nums.length;
k = k % len;
int[] res = new int[len];
for (int i = 0; i < len; ++i) {
if (i < k) {
res[i] = nums[len - k + i];
} else {
res[i] = nums[i - k];
}
}
System.out.println("ok");
// nums = res;
nums = Arrays.copyOf(res, res.length);
System.out.println("ok");
}
public static void main(String[] args) {
int[] temp = new int[]{1, 2, 3, 4, 5, 6, 7};
// int[] res = Solution189.rotate(temp, 3);
Solution189.rotate2(temp, 3);
System.out.println(temp);
}
这段代码在测试中即使最后函数中的nums已经修改了,但是函数外的值始终无法改变,导致我这边在不断调试。
最后发现是数组和对象一样都是引用传递,在函数中只是将新引用赋值给临时引用,但是此时函数外部的引用并没有变化。
java中基本类型是值传递,数组和对象以及字符串等是作为引用传递的
在Java中,Java的函数参数在传递的时候有两种方式。对于基本类型,如int,double等作为函数参数传递时,采取的是传值方式。而对于对象,如数组、字符串等作为参数传递时,采用的是引用方式,即此时在函数中对传递的对象的修改将完全影响原对象。但是你这里主函数中的unsort数组还是只想原来的内存。
// 最后修改后的答案
class Solution {
public void rotate(int[] nums, int k) {
if (nums == null || nums.length < 1 || k < 1) {
return;
}
int len = nums.length;
k = k % len;
int[] res = Arrays.copyOf(nums, nums.length);
for (int i = 0; i < len; ++i) {
if (i < k) {
nums[i] = res[len - k + i];
} else {
nums[i] = res[i - k];
}
}
}
}
网友评论