实现一个函数,可以左旋字符串中的k个字符

例如:

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

方法(1):采用循环移位,对需要旋转的k个字符按顺序进行旋转,先将要旋转的一个字符保存起来,将后面的往前挪动一位,再将保存起来的这个字符赋给最后一位,这样连续循环k次,就可以完成了。代码实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void left_move(char *p, int n)
{
	int i;
	int len = strlen(p);
	for (i = 0; i < n; i++)
	{
		char tmp = p[0];
		int j = 0;
		for (j = 0; j < len - 1; j++)
		{
			p[j] = p[j + 1];
		}
		p[len - 1] = tmp;
	}
}
int main()
{
	char arr[] = "abcdef";
	int n = 0;
	scanf_s("%d", &n);
	left_move(arr, n);
	printf("%s\n", arr);
	system("pause");
	return 0;
}

方法(2) 三步旋转法,先将要旋转的k个字符串逆序,再将剩余的字符串逆序,最后再对整个字符串逆序就得到了旋转k个字符后的字符串。代码实现如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reverse(char *left, char *right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
void left_move(char *p, int n)
{
	int len = strlen(p);
	reverse(p, p + n - 1);
	reverse(p + n, p + len - 1);
	reverse(p, p + len - 1);
}
int main()
{
	char arr[] = "abcdef";
	int n = 0;
	scanf_s("%d", &n);
	left_move(arr, n);
	printf("%s\n", arr);
	system("pause");
	return 0;
}

分析上面两个方法,方法(1)中至少要循环n*(len-1)次,效率比较低,方法(2)的效率更高一点。