天天算法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;
}

参考资料:

http://blog.csdn.net/v_JULY_v/article/details/6322882

posted on 2011-10-26 22:31  comeby  阅读(282)  评论(0编辑  收藏  举报