要求:时间复杂度为O(N) 思路: 将一个字符串分成两部分,X 和Y 两个部分,在字符串上定义反转的操作X^T,即把X 的所有字符反转(如,X=”abc”,那么X^T=”cba”),那么我们可以得到下面的结论: (X^TY^T)^T=YX。显然我们这就可以转化为字符串的反转的问题了。 就拿abcdef 这个例子来说,若要让def 翻转到abc 的前头,那 么只要按下述3 个步骤操作即可: 1、首先分为俩部分,X:abc,Y:def; 2、X->X^T,abc->cba, Y->Y^T,def->fed。 3、(X^TY^T)^T=YX,cbafed->defabc,即整个翻转。
void reverse(char*start, char*end) { if (start == NULL || end ==NULL) return; while (start < end) { char tmp = *start; *start = *end; *end = tmp; start++; end--; } } void *left(char *s, int pos) //pos 为要旋转的字符个数,或长度 { int len = strlen(s); reverse(s, s + (pos - 1)); //如上,X->X^T,即abc->cba reverse(s + pos, s + (len - 1)); //如上,Y->Y^T,即def->fed reverse(s, s + (len - 1)); //如上,整个翻转,(X^TY^T)^T=YX,即cbafed->defabc。 }