You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:42:53