LeetCode 189. Rotate Array代码提交报错但控制台输出正确求助
解决LeetCode 189. Rotate Array提交错误的问题
你的代码控制台输出正确,但提交后判题失败,核心问题有两个:
- 参数传递逻辑错误:Java中数组参数传递的是引用副本,你在方法里执行
nums = new int[arr.length];后,方法内的nums变量指向了新创建的数组,但外部传入的原数组引用完全没被修改——LeetCode判题系统只会检查原数组的状态,所以你的修改根本没生效。 - 未处理k超出数组长度的情况:比如数组长度为3、k=4时,
l-k会变成负数,直接导致循环索引越界。
修正方案一:复用原数组(额外空间O(n))
把新数组的内容复制回原数组,同时处理k的边界情况:
import java.util.Arrays; class Solution { public void rotate(int[] nums, int k) { int l = nums.length; k = k % l; // 处理k大于数组长度的情况 if (k == 0) return; // 无需旋转直接返回 int[] arr = Arrays.copyOf(nums, l); // 复制原数组备份 int idx = 0; // 把后k个元素移到前面 for (int i = l - k; i < l; i++) { nums[idx++] = arr[i]; } // 把前l-k个元素移到后面 for (int i = 0; i < l - k; i++) { nums[idx++] = arr[i]; } } }
修正方案二:原地旋转(空间复杂度O(1),进阶最优解)
通过三次反转实现原地修改,不需要额外数组:
class Solution { public void rotate(int[] nums, int k) { int l = nums.length; k = k % l; if (k == 0) return; // 1. 反转整个数组 reverse(nums, 0, l - 1); // 2. 反转前k个元素 reverse(nums, 0, k - 1); // 3. 反转剩余的l-k个元素 reverse(nums, k, l - 1); } // 辅助反转方法 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--; } } }
内容的提问来源于stack exchange,提问作者Abdulllah Aziz Shakkhor
相关产品推荐
相关产品推荐

