题目:(微软面试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; }
参考资料: