例如字符串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;
}
通过两种方法比较,发现第二种方法执行效率更高,但第二中方法不易想到,通过左旋,右旋也很好实现,此类问题主要是要能从问题中发现规律并用程序很好的实现,这更好的说明了一点,编程的思路很重要。