三种方法"/>
字符串左旋的三种方法
一.题目:
要求左旋一个字符串,
例如将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个字节的空间来做这个tmpstrcpy(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;
}
更多推荐
字符串左旋的三种方法
发布评论