天天算法01——左旋转字符串
题目:(微软面试100题中的第26题)
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcd1234左旋转4位得到字符串1234abcd。
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。
解答:
逆序排列abcd:abcd1234 → dcba1234;
逆序排列1234:dcba1234 → dcba4321;
全部逆序:dcba4321 → 1234abcd。
#include <stdio.h>
#include <string.h>
void revise(char *str, int length)
{
char c;
int i = 0;
for(; i<length/2; i++){
c = *(str+i);
*(str+i) = *(str+(length-i-1)*sizeof(char));
*(str+(length-i-1)*sizeof(char))=c;
}
}
void leftrotate(char *p, int m)
{
int len = strlen(p);
revise(p, m);
revise(p+m, len-m);
revise(p, len);
}
int main()
{
char a[]="abcd1234";
leftrotate(a, 4);
printf("%s", a);
return 0;
}
参考资料:
浙公网安备 33010602011771号