例如字符串arr[]="abcde";左旋一位为"bcdea";

第一种方法也是比较容易想到的方法,根据移动的位数,逐个给新元素赋值,代码如下

//#include<stdio.h>

//#include<stdlib.h>

//#include<string.h>

//left_mv(char *str, int num)//若不重新定义数组,之前需要移动的数组便会被重新赋值,导致数组后面无法正确赋值,AABB左移两位,BBBB

//{

// char a[5];

// int len = strlen(str);

// int i = 0;

// int j = 0;

// for (j = 0; j < len - num; j++)

// {

// a[i++] = str[j];

// str[j] = str[j + num];

// }

// i = 0;

// for (j = len - num; j < len; j++)

// {

// str[j] = a[i++];

// }

//

//}

//int main()

//{

// char arr[] = "ABCDA";

// int num = 0;

// printf("请输入左旋位数");

// scanf("%d", &num);

// left_mv(arr,num);

// printf("%s", arr);

// system("pause");

// return 0;

//}

这种方法比较好理解但不是此题最优解,第二种方法,三步反转法,代码如下

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#include<stdlib.h>

#include<string.h>

void reverse(char *left,char *right)//三步反转法

{

while (left < right)

{

char temp = *left;

*left = *right;

*right = temp;

left++;

right--;

}

}

void left_move(char *arr, int num)

{

int len = strlen(arr);

reverse(arr, arr+num-1);

reverse(arr+num, arr+len-1);

reverse(arr, arr+len-1);

}

int main()

{

char arr[] = "abcde";

int num = 0;

scanf("%d", &num);

left_move(arr, num);

printf("%s", arr);

system("pause");

return 0;

}

通过两种方法比较,发现第二种方法执行效率更高,但第二中方法不易想到,通过左旋,右旋也很好实现,此类问题主要是要能从问题中发现规律并用程序很好的实现,这更好的说明了一点,编程的思路很重要。