问题:把一个含有N个元素的数组循环右移K位,要求时间复杂度O(N),且只允许使用两个额外变量。
思路一:循环K次,每次循环右移一位。
代码:
void RightShift(int *A,int N,int K)
{
while(K--)
{
int t = A[N-1];
for(int i = N-1; i > 0; i--)
{
A[i] = A[i-1];
}
A[0] = t;
}
}
思路二:考虑循环右移N次数组无变化。
代码:
void RightShift2(int *A,int N,int K)
{
K %= N;
while(K--)
{
int t = A[N-1];
for(int i=N-1;i>0;i--)
{
A[i] = A[i-1];
}
A[0] = t;
}
}
思路三:
数组1234abcd,循环右移4位的结果,为abcd1234,可以分三步得到,逆序abcd——>1234dcba,逆序1234——>4321dcba,全部逆序abcd1234。
代码:
void Reverse(int *A,int b,int e)
{
for(;b<e;b++,e--)
{
int t = A[b];
A[b] = A[e];
A[e] = t;
}
}