实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
方法一
一、我们先假定这串字符为ABCDE,假设左旋1次,我们可以进行如下操作
ABCDE(一开始)
BBCDE(第一次:第一位赋值第二位的字符)
BCCDE(第二次:第二位赋值第三位的字符)
BCDDE(第三次:第三位赋值第四位的字符)
BCDEE(第四次:第四位赋值第五位的字符)
最后我们还差最后一个E换成A
BCDEA(第五次:=第五位赋值一开始字符第一位的字符)
代码如下:(记len为字符串长度)
ret=arr[0];
for (i = 0; i < len; i++)
{
if (4 == i)
{
arr[i] = ret;
//赋值一开始的第一位
}
if (i <= 3)
{
arr[i] = arr[i + 1];
//前一位赋值后一位
}
}
二、当左旋次数可随意改变时,我们可以用while循环来控制
使左旋次数=循环次数,记我们要左旋k个字符即循环k次
循环一次,k减一次1,当k一直减到0时,循环跳出
所以我们用while(k) k=0时在C语言表示为假,跳出循环
代码如下:
#include<stdio.h>
char Left_hand(char* arr, int k)
{
int right = 0;
int i = 0;
int len = strlen(arr);//求出字符串长度
char ret;
while (k)
{
ret = arr[0];
for (i = 0; i < len; i++)
{
if (4 == i)
{
arr[i] = ret;
}
if (i <= 3)
{
arr[i] = arr[i + 1];
}
}
k--;
}
}
int main()
{
char arr[] = "ABCDE";
int k = 0;
scanf("%d", &k);
Left_hand(arr, k);
printf("%s\n", arr);
return 0;
}
方法二
1.考虑挪动几次;
int time = k % len;
2.怎么挪动
for (int i = 0; i < time; i++)
{
char tmp = src[0];
int j = 0;
for (j=0;j < len-1; j++)
{
src[j] = src[j + 1];
}
src[j] = tmp;
}
代码如下:
#include <string.h>
void left_round(char* src, int k)
{
int len = strlen(src);
int time = k % len;
for (int i = 0; i < time; i++)
{
char tmp = src[0];
int j = 0;
for (j=0;j < len-1; j++)
{
src[j] = src[j + 1];
}
src[j] = tmp;
}
}
int main()
{
char str[] = "abcdefs";
left_round(str, 3);
printf("%s", str);
return 0;
}