题目描述
字符串左旋:实现一个函数,可以左旋字符串中的k个字符。
例如:ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
关于字符串左旋的解法,我们有两种思路供读者参考,读者具体使用哪种方法,要看读者对两种方法的理解是否到位,如果能够理解并运用两种方法完成的话,会进一步加深对知识的理解。
方法一(临时变量+移动)
//1.先试用临时变量将第一个字符存起来
//2.将后面的字符移到前面
//3.将临时变量的值放到最后
//循环进行上面的操作
看到这里,有很多小伙伴们并不是很理解,那么我们来画图理解,具体是怎么实现的:
假设原来数组arr中有六个元素,abcdef;对数组进行操作:
代码实现
#include <stdio.h>
#include <string.h>
void left_move(char arr[], int k)
{
int len = strlen(arr);//求出字符串的长度为len,需要引头文件#include <string.h>
int j = 0;
for (j = 0; j < k % len; j++)//这里的k%len可以减少操作次数
{
int tmp = arr[0];//临时变量储存第一个字符
int i = 0;
for (i = 0; i < len - 1; i++)
{
arr[i] = arr[i + 1];//后面字符前移
}
arr[len - 1] = tmp;//储存的字符放到最后的位置
}
}
int main()
{
char arr[] = "abcdef";
int k = 0;
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
方法二(三次逆序)
//1.先逆序要左旋的字符串
//2.逆序剩下的字符串
//3.整体逆序
画图理解:
代码实现
//逆序函数
void reverse(char* left, char* right)
{
//使用双指针完成逆序
while (left < right)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_move(char arr[], int k)
{
int len = strlen(arr);
k %= len;//防止数组越界
reverse(arr, arr + k - 1);
reverse(arr + k, arr + len - 1);
reverse(arr, arr + len - 1);
}
int main()
{
char arr[] = "abcdef";
int k = 0;
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}