题目理解:
a数组中有10个数,a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
假设左移4个数,那么结果为{5, 6, 7, 8, 9, 10, 1, 2, 3, 4}。

思路1:
如果左移p个数,将前p个数存到临时数组中,然后p之后的所有数据向前移动p个数,最后将临时数组中原来的前p个数添加到数组的末尾。

  1. b[0] - b[p-1] = a[0] - a[p-1]
  2. a[0] = a[p] 一直到a[n-1] // n是数组大小,数据向前移动
  3. a[n-p] = b[0] 一直到b[p-1]

代码:

#include<iostream>
using namespace std;
int a[100], b[100];
void move(int a[], int p, int n)
{
    int i, t, j, k;
    for(i = 0; i < p; i++)
    {
        b[i] = a[i];//临时存储
    }
    k = n - p ;
    t = p;
    for(i = 0; t < n; i++, t++)
    {
        a[i] = a[t];
    }
    for(j = n - p, i = 0; j < n; j++, i++)
    {
        a[j] = b[i];
    }
    for(i = 0; i < n; i++)
        cout<<a[i]<<' ';
}
int main()
{
    int i, n, p;
    cin>>n;
    for(i = 0; i < n; i++)
    {
        a[i] = i+1;
    }
    for(i = 0; i < n; i++)
    {
        cout<<a[i]<<' ';
    }
    cin>>p;
    move(a, p, n);
    return 0;
}

思路2:
将所有数组中的数据看做两段ab, 我们的结果是想把它变为ba,那么过程则是ab的转置->(ab)^-1 = (b^-1)*(a^-1)这时候再将ab转置即可得到ba。

如果p为4
1. a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,}经过转置
a[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
2. 前n-p个转置{5,6,7,8,9,10},后p个转置{1, 2, 3, 4}

#include<iostream>
using namespace std;
int a[100];
void reverse(int a[], int low, int high)
{
    int i = low, j = high;
    for(; i <= (high + low) / 2; i++, j--)
    {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}
int main()
{
    int n, p, i;
    cin>>n;
    for(i = 0; i < n; i++)
    {
        cin>>a[i];
    }
    cin>>p;
    reverse(a,0,n - 1);
    reverse(a,0,n - p - 1);
    reverse(a,n - p,n-1);
    for(i = 0; i < n; i++)
    {
        cout<<a[i]<<' ';
    }
    cout<<endl;
    return 0;
}
//空间复杂度O(n),时间复杂度O(n)