题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
思路:abcdef 左旋两位 以2位分界线,ab | cdef ,两边分别转置 ba | fedc ,然后整体转置 cdefab,达到目的
void Reverse(char* pBegin,char* pEnd)
{
if(pBegin == NULL || pEnd == NULL)
return;
while (pBegin<pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
pBegin++;
pEnd--;
}
}
char* LeftRotate(char* pStr,int n)
{
if(pStr!=NULL)
{
int length = strlen(pStr);
if(length > 0 && n > 0 && n < length)
{
char* pFirstBegin = pStr;
char* pFirstEnd = pStr + n -1;
char* pSecondBegin = pStr + n;
char* pSeondEnd = pStr + length -1;
Reverse(pFirstBegin,pFirstEnd);
Reverse(pSecondBegin,pSeondEnd);
Reverse(pFirstBegin,pSeondEnd);
}
}
return pStr;
}