定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。 请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。
编程之美上有这样一个类似的问题,咱们先来看一下
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N), 且只允许使用两个附加变量
我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次。 abcd1234→4abcd123→34abcd12→234abcd1→1234abcd
#include <stdio.h>
#include <stdlib.h>
void RightShift(char* arr,int N,int K)
{
K%=N;
while(K--)
{
char t=arr[N-1];
int i;
for(i=N-1;i>0;i--)
arr[i] = arr[i-1];
arr[0]=t;
}
}
int main()
{
//printf("Hello world!\n");
char arr[]="buaa123";
printf("the size of arr is %d.\n",sizeof(arr));
printf("the length of arr is %d.\n",strlen(arr));
RightShift(arr,strlen(arr),1);
printf("the arr is %s.\n",arr);
char s[]="ustb123";//char *s=????????????
printf("the size of array s is %d.\n",sizeof(s));
printf("the length of s is %d.\n",strlen(s));
RightShift(s,strlen(s),1);
printf("the array s is %s.\n",s);
return 0;
}
虽然这个算法可以实现数组的循环右移,但是算法复杂度为O(K * N),
原文地址:http://my.oschina.net/floristgao/blog/304177