实现一个函数,可以左旋字符串中的k个字符.ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB

#include<stdio.h>
#include<windows.h>
#include<string.h>
#include <stdlib.h> 
#include<assert.h>
  1. 方法一
    分析:原字符串ABCD1234,若要旋转4位,则将字符串分为两部分
    先将字符串ABCD逆序得:DCBA;
    然后将1234逆序得:4321;
    得到现在字符串:DCBA4321,再逆序得1234ABCD,即原字符串的左旋k位。
void Reverse(char* left, char* right)//字符串逆序
{assert(left);assert(right);while (left < right){*left ^= *right;//用异或来逆序*right ^= *left;*left ^= *right;left++;right--;}}
void LevoStrOne(char *str, int len , int k)
{assert(str);if (str != NULL && len > 0){k = k%len;//当k大于len时,取余避免多次旋转浪费时间,k小于len时取余依然是原值不影响结果Reverse(str + 0, str + k - 1);//字符串分为两部分,先逆序k位Reverse(str + k, str + len - 1);//逆序k后的字符串Reverse(str + 0, str + len - 1);//逆序整个字符串}else{return;}
}
  1. 方法二
    分析:开辟一个新的字符串空间s,先将ABCD1234复制过去,然后再将ABCD1234拼接在s后面得到ABCD1234ABCD1234,要移动k位,在s字符串中从第k位开始取原字符串长度复制到原字符串str中,这个操作可以用strncpy完成。
void LevoStrTwo(char str[], int len, int k)
{k %= len;char *s = (char *)malloc((2 * len + 1)*sizeof(char));//开辟所需字符串空间if (s == NULL){printf("mallic error\n");}strcpy(s,str);//拷贝字符串strcat(s,str);//拼接字符串strncpy(str, s + k, len);free(s);
}
  1. 方法三
    分析:先将A字符给temp保存,ABCD1234中从B字符开始向左拷贝得到BBCD1234,然后依次拷贝得到BCD12344,再将temp给字符串最后一位得到BCD1234A。
void LevoStrThree(char *str,int len,int k)
{k %= len;int i = 0;for (i=0; i < k; i++)//循环k次{int j = 0;char temp = str[j];for (j=0; j < len - 1; j++)//从第二个字符开始,字符依次向左覆盖一位{str[j] = str[j + 1];}str[j] = temp;//将第一个字符放在字符串最后位置}}
void test()
{char str[] = "ABCD1234";char *ret = NULL;int len = strlen(str);printf("原字符串:%s\n",str);LevoStrThree(str, len, 4);printf("左旋后的字符串:%s\n", str);}int main()
{test();system("pause");return 0;
}