Leetcode旋转数组代码在Codepen与平台运行结果不一致求因
问题原因及解决方法
核心问题在于Leetcode的这道旋转数组题要求原地修改输入的nums数组,而非返回一个新数组。你的代码在Codepen里能得到正确结果,是因为你直接打印了函数返回的新数组c,但Leetcode会检查传入的原nums数组的变化——你的代码里两次splice操作已经把原数组的元素全移走了,导致原nums变成空数组,所以Leetcode返回空。
拆解你的代码操作:
- 第一次
splice(0, nums.length - k)会把原数组前nums.length -k个元素移除,此时原nums里只剩下后k个元素(比如示例里就是[5,6,7]) - 第二次
splice(-k)又把这剩下的k个元素全部移除,原nums直接变成空数组 - 最后你返回的新数组
c,Leetcode根本不读取这个返回值,它只关心传入的原nums数组的最终状态
正确的原地修改写法
可以直接把移除的部分拼到原数组末尾,无需返回新数组:
var rotate = function(nums, k) { // 处理k大于数组长度的情况,避免无效操作 k = k % nums.length; // 移除前nums.length -k个元素,拼到数组末尾 nums.push(...nums.splice(0, nums.length - k)); };
操作后原nums数组会被直接修改为目标结果,完全符合Leetcode的判题要求。
另外也可以用三次反转的方法,空间复杂度更低:
var rotate = function(nums, k) { k = k % nums.length; // 反转整个数组 reverse(nums, 0, nums.length - 1); // 反转前k个元素 reverse(nums, 0, k - 1); // 反转剩下的元素 reverse(nums, k, nums.length - 1); }; function reverse(arr, start, end) { while (start < end) { [arr[start], arr[end]] = [arr[end], arr[start]]; start++; end--; } }
内容的提问来源于stack exchange,提问作者Baslki
相关产品推荐
相关产品推荐

