📜  在C ++中使用向量向左旋转数组(1)

📅  最后修改于: 2023-12-03 14:51:14.627000             🧑  作者: Mango

在C ++中使用向量向左旋转数组

在C ++中,使用vector容器很容易对数组进行旋转操作。 向左旋转数组即将数组中的元素向左移动k个位置,以最左侧的元素为起点,并将超出数组长度的元素放回数组末尾。

代码示例
#include <iostream>
#include <vector>

using namespace std;

// 向左旋转数组
void leftRotate(vector<int>& nums, int k) {
    int n = nums.size();
    k %= n; // 防止k大于n的情况
    reverse(nums.begin(), nums.begin() + k); // 翻转前k个元素
    reverse(nums.begin() + k, nums.end()); // 翻转剩余的元素
    reverse(nums.begin(), nums.end()); // 翻转整个数组
}

// 输出数组元素
void printArray(vector<int>& nums) {
    for (int i = 0; i < nums.size(); i++) {
        cout << nums[i] << " ";
    }
    cout << endl;
}

int main() {
    vector<int> nums = {1, 2, 3, 4, 5, 6, 7};
    int k = 3;
    cout << "Before rotation: ";
    printArray(nums);
    leftRotate(nums, k);
    cout << "After rotation: ";
    printArray(nums);
    return 0;
}
解释

代码中,我们首先定义了一个函数leftRotate,该函数接受一个vector引用nums和一个整数k作为输入参数,该函数使用了STL中的reverse函数,具体步骤如下:

  1. 如果k大于数组长度n,则将k对n取模(这是因为旋转k个位置等于旋转k % n个位置)。
  2. 翻转前k个元素,这意味着nums[0]将替换nums[k]的位置,nums[1]将替换nums[k+1]的位置,以此类推,nums[k-1]将替换nums[n-1]的位置,而元素nums[k]到nums[n-1]将保持不变。
  3. 翻转剩余的元素,即翻转nums[k]到nums[n-1]的元素,这样nums[k]将是数组的第一个元素,nums[k+1]将是数组的第二个元素,以此类推,nums[n-1]将是数组的倒数第二个元素。
  4. 翻转整个数组,将nums[0]到nums[n-1]的元素倒置,这样nums[k]到nums[n-1]将是数组的前k个元素,而nums[0]到nums[k-1]将是数组的剩余部分,根据题目要求,我们需要将超出数组长度的元素放回数组末尾。

最后,我们定义了一个printArray函数,用于输出数组元素,帮助我们验证旋转是否成功。

总结

通过使用STL中的vector容器和reverse函数,我们可以很容易地对数组进行向左旋转,这种方法的时间复杂度为O(n),其中n是数组元素的数量。