- 实现一个函数reverseLeftWords 可以左旋k个字符
例如:字符串ABCDEF
k =2 CDEFAB k=3 DEFABC
目录
方法一:
思路:
我们只要每次先把第一个元素存起来然后后面的元素依次往前移动,最后再把第一个元素放到最后。
#include<string.h>
#include<stdio.h>
void reverseLeftWords(char* str, int k)
{
int len = strlen(str);//计算字符串长度
int i = 0;
for (i = 0; i < k; i++)//循环k次
{
int j = 0;
char temp = *str;//把第一个元素存放起来
for (j = 0; j < len-1; j++)
{
*(str + j) = *(str + j + 1);//把后面的元素往前挪动
}
*(str + len - 1) = temp;//把最后一个元素放第一次存起来的元素
}
}
int main()
{
char str[] = "ABCDEF";
int k = 0;
scanf("%d", &k);
reverseLeftWords(str, k);
printf("%s", str);
return 0;
}
方法二:
我们左旋字符串分为三步第一步左旋前面k个字符,第二步左旋后面n-k个字符,最后整体逆序
#include<string.h>
#include<stdio.h>
void reverse_string(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void reverseLeftWords(char* str, int k)
{
int len = strlen(str);
reverse_string(str, str + k - 1);//逆序左边
reverse_string(str+k, str + len - 1);//逆序右边
reverse_string(str, str + len - 1);//逆序左边
}
int main()
{
char str[] = "ABCDEF";
int k = 0;
scanf("%d", &k);
reverseLeftWords(str, k);
printf("%s", str);
return 0;
}
方法三:
循环移位法:
char* reverseLeftWords(char* s, int k) {
int len = strlen(s);
char* ret = (char*)malloc(sizeof(char) * (len + 1));
for (int i = 0; i < len; ++i)
{
ret[i] = s[(i + k) % len];
}
ret[len] = '\0';//最后结尾放个\0防止输出随机值
return ret;
}
int main()
{
char str[] = "ABCDEF";
int k = 0;
scanf("%d", &k);
printf("%s", reverseLeftWords(str, k));
return 0;
}