问题描述: 将一个n元一维向量向左旋转 i 个位置。例如 n=8 i=3 向量=abcdefgh旋转为defghabc。使用数十字节的存储空间来进行计算。
通常做法将向量x的前i个元素复制到一个临时数组中,然后把余下的n-i个元素向左移动i个位置,最后将最初的i个元素从临时数组中复制到x的余下位置中。但是,这种办法使用了i个额外的位置,产生了过大的存储空间的消耗。下面提供一种方法
首先移动x[0]到临时变量t,然后移动x[i]到x[0],x[2i]到x[i],依次类推(将x中的所有下标对n取模),直至返回到取x[0]中的元素为止。
实例程序:
/*
*
* Created on: Nov 4, 2011
* Author: kof
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("error\n");
return -1;
}
char *original=argv[1];
char temp;
int strlength=strlen(original);
int rotate;
scanf("%d",&rotate);
if(rotate>=strlen(original))
{
printf("rotate is too big\n");
return -1;
}
temp=original[0];
int pre_index=0;
int cur_index=rotate;
while(cur_index!=0)
{
original[pre_index]=original[cur_index];
pre_index=cur_index;
cur_index=(cur_index+rotate)%strlength;
}
original[pre_index]=temp;
printf("rotate is %s\n",original);
return 0;
}