LeetCode 189:数组旋转后修改无法保留的问题求助
问题原因
Java里数组是引用类型,但方法参数采用值传递——传递的是数组引用的副本。你在rotate方法里执行nums = newArr时,只是把方法内部的局部引用变量指向了新创建的数组,而main方法里原本的数组引用完全没被改动,所以原数组的内容自然不会有变化。
修复方案
要保持返回类型为void并修改原数组,不能直接给参数变量赋值新数组,而是要把新数组的元素拷贝到原数组的内存空间中。另外你的原代码存在循环逻辑错误:第一个循环的条件i <= k是错误的,应该遍历原数组前nums.length - k个元素,放到新数组的k位置开始;第二个循环逻辑是正确的,用于处理后k个元素并放到新数组开头。
修正后的代码如下:
public class Solution { public void rotate(int[] nums, int k) { int n = nums.length; k %= n; int[] newArr = new int[n]; // 处理原数组前n-k个元素,放入新数组的k索引开始位置 for(int i = 0; i < n - k; i++) { newArr[i + k] = nums[i]; } // 处理原数组后k个元素,放入新数组的开头位置 for(int i = n - k; i < n; i++) { newArr[i - (n - k)] = nums[i]; } // 将新数组元素拷贝回原数组,覆盖原内容 System.arraycopy(newArr, 0, nums, 0, n); } 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); } } }
如果不想用System.arraycopy,也可以手动循环完成拷贝:
for (int i = 0; i < n; i++) { nums[i] = newArr[i]; }
可选优化:原地旋转(无需额外数组)
如果想避免开辟额外数组空间,可以采用三次翻转的原地解法:
- 翻转整个数组
- 翻转前
k个元素 - 翻转后
n-k个元素
代码示例:
public class Solution { public void rotate(int[] nums, int k) { int n = nums.length; k %= n; reverse(nums, 0, n - 1); reverse(nums, 0, k - 1); reverse(nums, k, n - 1); } // 辅助方法:翻转数组中[start, end]区间的元素 private void reverse(int[] nums, int start, int end) { while (start < end) { int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } } 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); } } }
内容的提问来源于stack exchange,提问作者Wiscoteju
相关产品推荐
相关产品推荐

