版权声明:知识无界限,大家可自由转载。 https://blog.csdn.net/xidianbaby/article/details/85474374
1-题目
:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。要求时间复杂度为O(n),辅助内存为O(1)。
2-示例
:
如把字符串abcdef
左旋转2位得到字符串cdefab
。
3-思路
:
把字符串看成有两段组成的,记位XY,左旋转相当于要把XY变成YX
;先在字符串上定义一种翻转操作
,就是翻转字符串中字符的先后顺序,把X翻转后记为XT,显然有(XT)T=X。首先对X和Y两段分别进行翻转操作,这样就能得到XTYT,接着再对XTYT进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX,正是期待的结果。
4-代码
:
char *LeftRotateString(char *pStr, unsigned int m)
{
if (pStr != NULL)
{
int len = strlen(pStr);
if (m > 0)
{
char *pFirstStart = pStr;
char *pFirstEnd = pStr + m - 1;
char *pSecondStart = pStr + m;
char *pSecondEnd = pStr + len - 1;
ReverseString(pFirstStart, pFirstEnd);
ReverseString(pSecondStart, pSecondEnd);
ReverseString(pFirstStart, pSecondEnd);
}
}
return pStr;
}
void ReverseString(char *pStart, char *pEnd)
{
if (pStart == NULL || pEnd == NULL)
{
while (pStart <= pEnd)
{
char temp = *pStart;
*pStart = *pEnd;
*pEnd = temp;
pStart++;
pEnd--;
}
}
}