#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
/*
【2010统考真题】42
设将n(n>1)个整数存放到一维数组R 中。设计一个在时间和空间两方面都尽可能高效的算法。
将 R 中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(x(0),x(1),x(2)..x(n-1))变
换为(x(p),x(p+1),…,x(0),x(1),....x(p-1))要求
1)给出算法的基本设计思想
2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
3)说明你设计算法的时间复杂度和空间复杂度。
*/
// leetcode-189
// class Solution
// {
// public:
// void rotate(vector<int> &nums, int k)
// {
// /*
// *向右推进 先整体再局部
// *向做推进 先局部再整体
// */
// k %= nums.size(); // 轮转 k 次等于轮转 k%n 次
// // 右
// ranges::reverse(nums);
// reverse(nums.begin(), nums.begin() + k);
// reverse(nums.begin() + k, nums.end());
// // 左
// // reverse(nums.begin(), nums.begin() + k);
// // reverse(nums.begin() + k, nums.end());
// // ranges::reverse(nums);
// }
// };
// 3次reverse操作即可
/*
0 1 2 3 4 5 ---> 2 3 4 5 0 1
(1) 5 4 3 2 | 1 0
(2) 2 3 4 5 | 0 1
(3) 2 3 4 5 0 1
*/
void m_reserse(int a[], int start, int end)
{
while (start < end)
{
swap(a[start], a[end]);
start++;
end--;
}
}
void printarray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
}
int main()
{
int a[] = {0, 1, 2, 3, 4, 5, 6};
int n = sizeof(a) / sizeof(a[0]);
printarray(a, n);
int p = 2;
// 先整体, 再局部
// m_reserse(a, 0, n - 1);
// m_reserse(a, 0, n - p - 1);
// m_reserse(a, n - p, n - 1);
// 左 -》先局部, 再整体
m_reserse(a, 0, p - 1);
m_reserse(a, p, n - 1);
m_reserse(a, 0, n - 1);
cout << endl;
printarray(a, n);
return 0;
}