题目描述:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串 abcdef 左旋转 2 位得到字符串 cdefab。请实现字符串左旋转的函数,要求对长度为 n 的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。
//first idea 暴力方式,时间复杂度(m*n)
//second idea 一次移动m个字符移动n/m次 时间复杂度(n)
/************************************
pclvmm
left_rang_string
2014-01-13 20:06
*************************************/
#include
#define LEN 10
#define GET_ARRAY_LEN(array,len) {len = sizeof(array)/sizeof(array[0]);}
//first idea violence
//O(m*n)
void leftshiftone(char s[], int n)
{
int i;
char t = s[0];
for( i = 1; i < n; i++)
s[i - 1] = s[i];
s[n - 1] = t;
}
void leftshift_1(char s[], int n, int m)
{
while( m-- )
leftshiftone(s, n);
}
//second idea: use pointer one time translate numbers of m
//O(m*(n%m))
void leftshift_2(char s[], int n, int m)
{
int i,t;
char *p,*q;
char st[m];
for(i = 0; i < m; i++)
st[i] = s[i];
p = s;
q = p + m;
while ( q + m < s + n){
for( i = 0; i < m; i++)
*(p + i) = *( q + i);
p = q;
q = q + m;
}
t = s + n -q;
for(i = 0; i < t; i++)
*(p + i) = *(q + i);
for(i = 0; i < m; i++)
*(p + t + i) = st[i];
}
int main(int argc, int * argv)
{
int len;
char ch[LEN] = "abcdefghjk";
GET_ARRAY_LEN(ch,len);
printf("%s\n",ch);
leftshift_1(ch,len,3);
leftshift_2(ch,len,3);
printf("%s\n",ch);
return 0;
}