LeetCode 189数组右旋转:返回vector结果错误但cout输出正确
问题分析与解决
你的代码核心问题有两个:
1. 不符合题目要求的修改方式
LeetCode 189题要求原地修改传入的nums数组,题目给出的函数签名是void rotate(vector<int>& nums, int k),但你写成了返回vector<int>类型。系统会忽略你的返回值,只检查原nums数组是否被正确修改——你的代码里原nums完全没变化,所以答案自然不匹配。
2. 未处理k大于数组长度的边界情况
如果k的值大于数组长度n(比如n=7,k=10),n-k会变成负数,第一个循环的起始索引非法,直接导致数组越界错误。必须先对k取模处理:k = k % n,如果取模后k=0,说明不需要旋转,直接返回即可。
修正后的代码(基于你的思路)
把函数改成void类型,最后将temp的内容复制回原nums数组:
using namespace std; class Solution { public: void rotate(vector<int>& nums, int k) { int n = nums.size(); k = k % n; // 处理k超过数组长度的情况 if (k == 0) return; vector<int> temp(n); // 复制最后k个元素到temp开头 for(int i = n - k; i < n; i++){ temp[i - (n - k)] = nums[i]; } // 复制前面n-k个元素到temp的k位置之后 for(int i = 0; i < n - k; i++){ temp[i + k] = nums[i]; } // 将temp内容覆盖原nums,完成原地修改 nums = temp; } };
更高效的原地旋转方法(无需额外空间)
可以用三次反转的方式,空间复杂度O(1),比你的方法更优:
using namespace std; class Solution { public: void rotate(vector<int>& nums, int k) { int n = nums.size(); k = k % n; if (k == 0) return; // 反转整个数组 reverse(nums.begin(), nums.end()); // 反转前k个元素 reverse(nums.begin(), nums.begin() + k); // 反转后面n-k个元素 reverse(nums.begin() + k, nums.end()); } };
内容的提问来源于stack exchange,提问作者Tan
相关产品推荐
相关产品推荐

