给定一个字符串,要求将字符串前面的若干个字符转移到字符串的尾部,例如:将“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);
}