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

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

1、可以通过字符串互换,每左旋一次,字符串第一个移到最后一个,其余字符整体向前移动一位。

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void reverse(char *str,int len,int k)
{
	int i;
	while(k--)
	{//左旋几次,整个字符串调整几次
		char tep=str[0];//第一个元素和最后一个元素互换
		for(i=0;i<len-1;i++)
		{
			str[i]=str[i+1];
		}
		str[len-1]=tep;
	}
}

int main()
{
	char arr[10]={0};
	int len,k;
	gets(arr);
	scanf("%d",&k);
	len=strlen(arr);
	k=k%len;//如果左旋次数大于字符串长度出现重复,所以要k需要模len
	reverse(arr,len,k);
	printf("%s\n",arr);
	system("pause");
	return 0;
}

2、上述方法效率较低。也可以把整个字符串看成两部分,然后逆置,在整体进行逆置就可以实现左旋k个字符。

代码如下:

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

void revolve(char *left,char *right)
{
	while(left<right)//进行逆序排列
	{
		char temp=*left;
		*left=*right;
		*right=temp;
		left++;
		right--;
	}
}

void left_move(char *str,int len,int k)
{
	assert(str);//指针有效性判断
	revolve(str,str+k-1);//逆序需要左旋的部分
	revolve(str+k,str+len-1);//逆序其余字符
	revolve(str,str+len-1);//逆序整个字符串
}

int main()
{
	char arr[10]={0};
	int len,k;
	gets(arr);
	scanf("%d",&k);
	len=strlen(arr);
	k=k%len;//如果左旋次数大于字符串长度出现重复,所以要k需要模len
	left_move(arr,len,k);
	printf("%s\n",arr);
	system("pause");
	return 0;
}