劍指offer之左旋轉(zhuǎn)字符串

1 題目

字符串的左旋轉(zhuǎn)操作是把字符串前面的若干字符轉(zhuǎn)移到字符串尾部,比如字符串a(chǎn)bcdef和數(shù)字2,函數(shù)返回左旋轉(zhuǎn)得到的結(jié)果是cdefgab

 
2 思路

先反轉(zhuǎn)字符串所有,通過數(shù)字n找到的邊界 ,然后再反轉(zhuǎn)字符串部分左邊和部分右邊。

 
3 代碼實現(xiàn)

    #include <stdio.h>
     
    /*
     * 反轉(zhuǎn)整個字符串
     */
    void reverse(char *begin, char *end)
    {
        if (NULL == begin || NULL == end)
            return;
        while (begin < end)
        {
            char temp = *end;
            *end = *begin;
            *begin = temp;
            ++begin;
            --end;
        }
    }
     
    /*
     * 左旋轉(zhuǎn)字符串
     * abcdefg
     * gfedcba
     * cdefgab
     */
    char* leftReverse(char *str, int n)
    {
        if (str == NULL || n < 0)
        {
            return NULL;
        }
        //先反轉(zhuǎn)所有字符串
        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到左右反轉(zhuǎn)分界地方
        while (n > 0)
        {
            --n;
            --end;
        }
        //反轉(zhuǎn)左邊一部分
        reverse(begin, end);
        //反轉(zhuǎn)右邊一部分
        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 運行結(jié)果

cdefgab



 


 


作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學習,
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎入門進階人工智能(鏈接)