剑指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


上一篇:dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3.2整合(十二)之 spring中RabbitMQ延迟队列的实现


下一篇:面试5 如何理解静态变量,局部变量,全局变量