我正在尝试做第 1 题。 LeetCode 189 但是我遇到了一个问题。代码如下:
public class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
int[] newArr = new int[nums.length];
for(int i = 0; i <= k; i++) {
newArr[i + k] = nums[i];
}
for(int i = nums.length - k; i < nums.length; i++) {
newArr[i - (nums.length - k)] = nums[i];
}
nums = newArr;
}
//function above should shift each element of the array "nums" to "k" times right
//below is the main where I tried to check if it worked fine
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7};
Solution sol = new Solution();
sol.rotate(nums, 3);
for(int i : nums) {
System.out.println(i);
}
}
}
在控制台打印出与 nums 数组原始形式完全相同的结果后,我决定进行调试。 rotate 功能正常工作并且确实达到了目的(即在
nums = newArr;
行之后,nums确实变成了{5,6,7,1,2,3,4})。但是我注意到在 main 中调用函数并完成执行后,nums 数组变回其原始形式 ({1,2,3,4,5,6,7}) 而不是保持 {5,6 ,7,1,2,3,4}。我想知道是什么原因造成的?如何在保持函数返回类型无效的同时将函数中所做的更改保留在数组中?
修复你的代码而不是做
nums = newArr;
作为方法旋转的最后一行,您应该考虑返回 newArr 并分配新数组/重新分配值:
int[] nums = {1,2,3,4,5,6,7};
Solution sol = new Solution();
int[] result = sol.rotate(nums, 3);
for(int i : result) { System.out.println(i); }
public int[] rotate(int[] nums, int k) {
<...> //code omitted for brevity
return newArr;
}
说明: 在 Java 中,当对象引用(在本例中为整数数组)传递给方法时,会创建引用的副本并将其传递给方法。这意味着该方法接收到一个新的引用,该引用指向与原始引用相同的对象,但它不是同一个引用。
要理解这一点,请考虑以下示例:
public class Example {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
changeArr(arr);
System.out.println(Arrays.toString(arr));
}
public static void changeArr(int[] arr) {
arr[0] = 0;
arr = new int[] {4, 5, 6};
}
}
在这个例子中,创建了一个数组 arr 并用 {1, 2, 3} 初始化。然后调用 changeArr 方法,传递对 arr 的引用。
changeArr方法内部,将arr的第一个元素改为0,修改了原数组。然而,创建了一个新数组 {4, 5, 6} 并且 arr 引用被更新为指向这个新数组。
方法返回时,原来的引用arr仍然指向修改后的数组{0, 2, 3},而不是新数组{4, 5, 6}。这表明传递给方法的引用与原始引用不同,并且对引用引用的对象所做的更改在方法外部可见,但对引用本身的更改则不可见。