给定一个字符串,要求将字符串前面的若干个字符转移到字符串的尾部,例如:将“abcdef”的前3个字符‘a、’b‘、’c‘移到字符串的尾部。
解法一:蛮力移位
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void left_shift_one(char *src, int n);
void left_rotate_string(char *src, int n, int m);
int main(int argc, char *argv[])
{
char str[] = "this is left";
printf("before:\n");
printf("%s\n", str);
left_rotate_string(str, strlen(str), 5);
printf("after:\n");
printf("%s\n", str);
return 0;
}
void left_shift_one(char *src, int n)
{
if (NULL == src)
{
return ;
}
char t = src[0];
for (int i = 1; i < n; ++i)
{
src[i - 1] = src[i];
}
src[n - 1] = t;
}
void left_rotate_string(char *src, int n, int m)
{
if (NULL == src)
{
return ;
}
while (m--)
{
left_shift_one(src, n);
}
}
解法二:三部反转
以“abcdef”为例
1)将元字符串分为X和Y两个部分,X为”abc“,Y为”def“
2)将X的所有字符反转,即相当于反转”abc“得到”cba“,再将Y的所有字符也反转,将”def“反转为”fed“
3)最后将以上得到的结果再整体反转,即”cbafed“得到”defabc“
#include <stdio.h>
#include <string.h>
void reverse_string(char *src, int from, int to);
void left_rotate_string(char *src, int n, int m);
int main(int argc, char *argv[])
{
char str[] = "abcdef";
int m = 3;
printf("%s\n", str);
left_rotate_string(str, strlen(str), m);
printf("%s\n", str);
return 0;
}
void reverse_string(char *src, int from, int to)
{
if (NULL == src)
{
return ;
}
while (from < to)
{
char tem = src[from];
src[from++] = src[to];
src[to--] = tem;
}
}
void left_rotate_string(char *src, int n, int m)
{
if (NULL == src)
{
return ;
}
m %= n;
reverse_string(src, 0, m - 1);
reverse_string(src, m, n - 1);
reverse_string(src, 0, n - 1);
}