实现一个函数,可以左旋字符串中的k个字符。
例如:ABCD左旋一个字符得到BCDA,ABCD左旋两个字符得到CDAB
方法一:赋值
想象一下,如果是左旋一个字符,就是将第一个字符存放到一个临时变量里,然后把后一个字符赋给前一个字符,最后将第存放在临时变量里的第一个数放到最后就行,这样这样就完成了左旋,如果需要左旋k个字符,就这样循环k次就行,我们还发现,如果k是字符串长度的倍数的话,其实我们循环完一个字符串长度,字符串就变成了原样,所以我们需要用k对字符串长度取余,用余数来决定循环的次数。
#include <stdio.h>
#include<string.h>
void leftRound(char* s, int time)
{
int len = strlen(s);
int t = time % len;
int i = 0;
for (int j = 0; j < t; j++)
{
char tmp = s[0];
for (i = 0; i < len - 1; i++)
{
s[i] = s[i + 1];
}
s[i] = tmp;
}
}
int main()
{
int time = 0;
char str[] = "ABCD";
scanf("%d", &time);
leftRound(str,time);
printf("%s\n", str);
return 0;
}
方法二:运用库函数 strcpy()和strncat()
如果左旋两个字符,将原来字符串的后两个拷贝到一个空的字符串里,再将前两个字符拼接到后两个字符即可。
strcpy(str1,str2)//将str2拷贝给str1
strcat(str3,str4)//将str4拼接到str3上
strncat(str3,str4,n)//将str4里的前n个字符拼接到str3上
#include <stdio.h>
#include<string.h>
void leftRound(char* str,int time)
{
int len = strlen(str);
int t = time % len;
char tmp[200] = { };
strcpy(tmp, str + t);
strncat(tmp, str, time);
printf("%s\n", tmp);
}
int main()
{
char str[] = "ABCD";
int time = 0;
scanf("%d", &time);
leftRound(str, time);
return 0;
}
方法三:三段旋转
#include <stdio.h>
#include<string.h>
void reverse(char* a,int start,int end)
{
int left = start;
int right = end;
while (left < right)
{
char tmp = a[left];
a[left] = a[right];
a[right] = tmp;
left++;
right--;
}
}
int main()
{
char str[100] = "ABCD";
size_t len = strlen(str);
int t = 0;
scanf("%d", &t);
int time = t % len;
reverse(str,0,time-1);
reverse(str,time,len-1);
reverse(str,0,len - 1);
printf("%s\n", str);
return 0;
}