剑指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
(0)

相关推荐