剑指offer之左旋转字符串

1 题目

字符串的左旋转操作是把字符串前面的若干字符转移到字符串尾部,比如字符串abcdef和数字2,函数返回左旋转得到的结果是cdefgab

 
2 思路

先反转字符串所有,通过数字n找到的边界 ,然后再反转字符串部分左边和部分右边。

 
3 代码实现

    #include <stdio.h>
     
    /*
     * 反转整个字符串
     */
    void reverse(char *begin, char *end)
    {
        if (NULL == begin || NULL == end)
            return;
        while (begin < end)
        {
            char temp = *end;
            *end = *begin;
            *begin = temp;
            ++begin;
            --end;
        }
    }
     
    /*
     * 左旋转字符串
     * abcdefg
     * gfedcba
     * cdefgab
     */
    char* leftReverse(char *str, int n)
    {
        if (str == NULL || n < 0)
        {
            return NULL;
        }
        //先反转所有字符串
        char *begin = str;
        char *end = str;
        int len = 0, count = n;
        while (*end != '\0')
        {
            ++end;
            ++len;
        }
        if (n > len)
        {
            return NULL;
        }
        end--;
        reverse(begin, end);
        begin = str;
        //移动end到左右反转分界地方
        while (n > 0)
        {
            --n;
            --end;
        }
        //反转左边一部分
        reverse(begin, end);
        //反转右边一部分
        reverse(end + 1, end + count);
        return str;
    }
     
    int main()
    {
        char b[] = "abcdefg";
        char *result = NULL;
        result = leftReverse(b, 2);
        printf("%s\n", result);
        return 0;
    }

 
4 运行结果

cdefgab



 


 


作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)