一.题目:
要求左旋一个字符串,
例如将ABCDEF
左旋两次后得到CDEFAB
方法一:
1.思路:先把第一个元素拿出来,然后剩下的元素左移,最后把第一个元素放在最后的位置。
2.注意:k%=len,
代码如下:
#include <stdio.h>
#include <assert.h>
#include <string.h>
void Left_Move(char arr[], int k)
{
int i = 0;
int len = strlen(arr);
k %= len; // 有可能len大于字符串长度,余数就是左移的次数
for (i = 0; i < k; i++)
{
char tmp = arr[0]; //把第一个元素拿出来,先赋值。
int j = 0;
for (j = 0; j < len-1; j++)
{
arr[j] = arr[j + 1]; //左移
}
arr[len - 1] = tmp; //把第一个元素赋值到最后
}
}
int main()
{
char arr[] = "abcdef";
int k = 0;
scanf("%d", &k);
Left_Move(arr, k);
printf("%s", arr);
return 0;
}
方法二:逆序交换三次
1.思路:可以先将AB和CDE分别逆序得到BAEDC这个字符串,让后再将它们整体逆序得到CDEAB,即可得到结果。
代码如下:
#include <assert.h>
#include <string.h>
void reverse(char* left,char* right)
{
assert(left && right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void Left_Move(char arr[], int k)
{
int len = strlen(arr);
k %= len;
reverse(arr,arr+1); //左
reverse(arr+2,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", arr);
return 0;
}
方法三:用库函数strcpy,strncat
1.思路:假设,我们需要将字符串ABCDE左旋,我们可以首先在其后面再接一个ABCDE字符串,
即ABCDEABCDE,然后我们需要左旋k次,就在后面的ABCDE里截取k个值,再将开头的k个值舍去即可。
代码如下:
#include <string.h>
void Left_Move(char arr[], int k)
{
int len = strlen(arr);
int pos = k % len; //断开位置的下标
char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmp
strcpy(tmp, arr + pos);//先将后面的全部拷过来
strncat(tmp,arr,pos); //然后将前面几个接上
strcpy(arr,tmp); //最后拷回去
}
int main()
{
char arr[] = "abcdef";
int k = 0;
scanf("%d", &k);
Left_Move(arr, k);
printf("%s", arr);
return 0;
}