程序员面试一百题-21-左旋转字符串

版权声明:知识无界限,大家可自由转载。 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--;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/xidianbaby/article/details/85474374