什么叫做字符串旋转?
1、暴力求解法:
例如:将字符串abcdef左旋转2个字符这个字符串将变成cdefab。
//(0=<k<=字符串长度)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* LeftMove(char *str, int k)
{
int i = 0;
int len = strlen(str);
assert(k >= 0 && k <= len);
for (i = 0; i < k; i++)
{
//1、保存第一个字符
char tmp = *str;
//2、把后续的字符全部向前移动
int j = 0;
for (j = 0; j < len - 1; j++)
{
*(str + j) = *(str + j + 1);
}
//3、把保存起来的字符放到最后
*(str + len - 1) = tmp;
}
return str;
}
int main()
{
int k = 0;
char arr[] = "abcdef";
scanf("%d", &k);
LeftMove(arr, k);
printf("%s\n", arr);
return 0;
}
2、三步翻转法:
例如还是将字符串abcdef左旋转2个字符。
我们可以将 字符串abcdef分成两部分:第一部分是ab。第二部分是cdef。
1.我们可以先将ab翻转,将cdef翻转;
2.翻转之后第一部分为ba,第二部分为fedc;
3.最后一步将整体在翻转一次就变成了cdefba;
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
void Reverse(char *left, char *right)
{
assert(left != NULL);
assert(right != NULL);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
char* LeftMove(char *str, int k)
{
int len = strlen(str);
Reverse(str, str + k - 1);
Reverse(str+k, str + len - 1);
Reverse(str, str + len - 1);
return str;
}
int main()
{
int k = 0;
scanf("%d", &k);
char arr[] = "abcdef";
LeftMove(arr, k);
printf("%s\n", arr);
return 0;
}