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