/*
数组循环移位:
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。
此题已经做过,但本题的收获是注意循环移位,即,当K大于N时,注意到移N位后与没移位是一样的效果。因此
k %= n;
输入:
6 10
5 6 1 2 3 4
输出:
1 2 3 4 5 6
*/
/*
关键:
1 k %= iLen;//防止k大于n,简化循环右移的处理
2 rightShift(pArr,0,iLen - k -1);//应该先移动n - k - 1个元素而不是k -1
*/
#include <stdio.h>
const int MAXSIZE = 10000;
void rightShift(int* pArr,int low,int high)
{
int iTemp;
for(; low < high ; low++,high--)
{
iTemp = pArr[low];
pArr[low] = pArr[high];
pArr[high] = iTemp;
}
}
void reverse(int* pArr,int iLen,int k)
{
if(!pArr || iLen <= 0)
{
return;
}
k %= iLen;//防止k大于n,简化循环右移的处理
rightShift(pArr,0,iLen - k -1);//应该先移动n - k - 1个元素而不是k -1
rightShift(pArr,iLen - k,iLen-1);
rightShift(pArr,0,iLen-1);
}
void print(int* pArr,int iLen)
{
for(int i = 0 ; i < iLen ; i++)
{
if(i)
{
printf(" %d",pArr[i]);
}
else
{
printf("%d",pArr[i]);
}
}
printf("\n");
}
void process()
{
int n,k;
while(EOF != scanf("%d %d",&n,&k))
{
int iArr[MAXSIZE];
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&iArr[i]);
}
reverse(iArr,n,k);
print(iArr,n);
}
}
int main(int argc,char* argv[])
{
process();
getchar();
return 0;
}
编程之美:第二章 数字之魅 2.17数组循环移位
最新推荐文章于 2018-10-17 08:49:43 发布