📅  最后修改于: 2023-12-03 15:11:16.924000             🧑  作者: Mango
本程序采用反转算法实现了对数组的右旋转操作。旋转次数由用户输入。
#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, 2, 3, 4, 5]$ 反转后变为 $[5, 4, 3, 2, 1]$;
再反转前 $k$ 个元素;
例如:对于 $k=3$, 前3个元素反转后变为 $[3, 4, 5, 2, 1]$;
最后反转后 $n-k$ 个元素。
例如: 对于 $k=3$, 后2个元素反转后变为 $[3, 4, 5, 1, 2]$;
反转的时间复杂度为$O(n)$。
本程序采用了上述的反转算法实现数组旋转。运行程序时,用户输入数组元素和旋转次数,程序输出旋转后的数组。