📌  相关文章
📜  用于数组右旋转的反转算法的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:11:16.924000             🧑  作者: Mango

用于数组右旋转的反转算法的 C++ 程序

本程序采用反转算法实现了对数组的右旋转操作。旋转次数由用户输入。

代码
#include <iostream>
#include <vector>
using namespace std;

// 反转函数,反转i到j之前的元素
void reverse(vector<int> &nums, int i, int j) {
    while (i < j) {
        swap(nums[i], nums[j]);
        i++;
        j--;
    }
}

void rotate(vector<int> &nums, int k) {
    int len = nums.size();
    k = k % len;
    reverse(nums, 0, len-1);
    reverse(nums, 0, k-1);
    reverse(nums, k, len-1);
}

int main() {
    int n, k;
    vector<int> nums;
    cout << "请输入数组长度: ";
    cin >> n;
    cout << "请输入数组元素: ";
    for (int i = 0; i < n; i++) {
        int num;
        cin >> num;
        nums.push_back(num);
    }
    cout << "请输入旋转次数: ";
    cin >> k;
    rotate(nums, k);
    cout << "旋转后的数组为: ";
    for (int i = 0; i < n; i++) {
        cout << nums[i] << " ";
    }
    cout << endl;
    return 0;
}
介绍

数组旋转是面试中常见的问题之一。旋转的方法有多种,其中反转算法是比较常见且容易理解的一种:

  1. 先反转整个数组;

    例如:$[1, 2, 3, 4, 5]$ 反转后变为 $[5, 4, 3, 2, 1]$;

  2. 再反转前 $k$ 个元素;

    例如:对于 $k=3$, 前3个元素反转后变为 $[3, 4, 5, 2, 1]$;

  3. 最后反转后 $n-k$ 个元素。

    例如: 对于 $k=3$, 后2个元素反转后变为 $[3, 4, 5, 1, 2]$;

反转的时间复杂度为$O(n)$。

本程序采用了上述的反转算法实现数组旋转。运行程序时,用户输入数组元素和旋转次数,程序输出旋转后的数组。