题目理解:
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个数添加到数组的末尾。
- b[0] - b[p-1] = a[0] - a[p-1]
- a[0] = a[p] 一直到a[n-1] // n是数组大小,数据向前移动
- 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)