2010-42

68 阅读1分钟
#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;
}