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

手动旋转vector问题:循环右旋转功能实现出错求助

解决Vector循环右旋转的常见问题

兄弟,我一看你这需求就知道大概率是旋转逻辑没处理好——手动实现循环旋转很容易踩几个坑:比如没处理旋转次数超过数组长度的情况,或者把左旋转和右旋转搞混了,甚至手动移动元素时索引写错导致覆盖。咱一步步来把问题解决掉。

先明确核心需求

循环右旋转k次的本质是:把vector的最后k个元素整体移到最前面。比如原数组是[1,2,3,4,5,6,7,8,9,10],右旋转3次后应该变成[8,9,10,1,2,3,4,5,6,7]。另外要注意:

  • 如果k等于vector长度,旋转后和原数组一样
  • 如果k大于长度,比如k=13,等价于k=13%10=3次旋转(避免做无用功)
  • 如果k是负数,比如k=-1,等价于右旋转9次(或者左旋转1次)

两种靠谱的实现方式

方式一:用Reverse技巧(高效无额外空间)

这是业内常用的小技巧,分三步:

  1. 反转整个vector
  2. 反转前k个元素
  3. 反转剩下的n-k个元素

代码示例(完整可运行):

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> vec;
    cout << "请输入10个整数:" << endl;
    for (int i = 0; i < 10; ++i) {
        int num;
        cin >> num;
        vec.push_back(num);
    }

    int rotate_times;
    cout << "请输入循环右旋转的次数:" << endl;
    cin >> rotate_times;

    int n = vec.size();
    // 处理旋转次数,避免无效操作和索引越界
    rotate_times = rotate_times % n;
    if (rotate_times < 0) {
        rotate_times += n; // 负数转为等价的正次数
    }

    // 核心旋转逻辑
    reverse(vec.begin(), vec.end());
    reverse(vec.begin(), vec.begin() + rotate_times);
    reverse(vec.begin() + rotate_times, vec.end());

    // 输出结果
    cout << "旋转后的结果:" << endl;
    for (int num : vec) {
        cout << num << " ";
    }
    cout << endl;

    return 0;
}

方式二:直接用STL的Rotate函数(简洁不易错)

STL的std::rotate默认是左旋转,但我们可以通过调整参数实现右旋转:

  • rotate(first, middle, last)的作用是把[first, middle)的元素移到[middle, last)的后面
  • 要实现右旋转k次,只需要把middle设为vec.end() - k,这样就把最后k个元素移到最前面

把上面代码的核心旋转逻辑换成下面这行就行:

rotate(vec.begin(), vec.end() - rotate_times, vec.end());

你之前代码可能出错的原因

  1. 没处理旋转次数的取模:比如输入k=15,你循环旋转15次,虽然结果可能对,但做了5次无用功;如果你的手动实现逻辑在k>n时索引越界,直接就崩了。
  2. 混淆左/右旋转逻辑:比如你写的是左旋转的代码(把前面k个元素移到后面),却当成右旋转用,结果自然不对。
  3. 手动移动元素时索引错误:比如你想把前面的元素后移,却从i=0开始遍历,导致vec[i+1] = vec[i]把所有元素覆盖成第一个值,这是新手常踩的坑。

调试小技巧

如果还是有问题,建议用小测试案例验证:比如输入3个元素1 2 3,旋转1次,预期结果是3 1 2。一步步打印每一步的vector值,就能快速定位哪里错了。

内容的提问来源于stack exchange,提问作者Programmer18

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:20:08