实现一个函数可以左旋字符串中的k个字符。例如ABCD左旋一个字符得到BCDA、ABCD左旋两个字符得到CDAB方法一暴力旋转一次一次去旋转直到符合条件#include stdio.h#include string.hvoid leftRound(char* str, int k)//k是要求左旋的次数{int len strlen(str);k % len;//有可能次数会太多实际旋转无需重复旋转只需旋转关键几步for (int i 0; i k; i)//旋转不重复的k次就是k次循环{char tmp str[0];//临时变量接收字符串的第一个位置for (int j 0; j len - 1; j)//把字符串后面的位置往前移{str[j] str[j 1];}str[len - 1] tmp;//如果不用临时变量保存第一个位置的字符//那么上面的for j的循环会把str[0]的位置覆盖导致无法左旋成功}}int main(){char str[] ABCDEFGH;puts(str);leftRound(str, 4);puts(str);}方法二拼接法把字符串分两部分去进行拼接#include stdio.h#include string.hvoid leftRound(char* str, int k)//k是要求左旋的次数{int len strlen(str);k % len;char ptr[256];////更准确的话可以选择//malloc len 1个字节的空间来做这个tmp//也就是char* ptr (char*)malloc(sizeof(char) * (len 1);strcpy(ptr, str k);//把字符串k个位置后面的内容先放在一个新的字符数组中strncat(ptr, str, k);//把字符串前面k个位置拼接到新的字符数组后面strcpy(str, ptr);//最后把新的字符数组拷贝回原来的字符数组//基于这个思路我们是不是可以得到后面的三步原地旋转法}int main(){char str[] ABCDEFGH;puts(str);leftRound(str, 5);puts(str);}方法三三步逆置法思考那么该思路后续是否会被频繁使用吗#include stdio.h#include string.hvoid reverse_part(char* str, int start, int end)//把字符串从开始位置到终点位置的内容进行逆置{int left start;int right end;while (left right)//一步一步循环进行逆置{char tmp str[left];str[left] str[right];str[right] tmp;left;right--;}}void leftRound(char* str, int k)//k是要求左旋的次数{int len strlen(str);k % len;reverse_part(str, 0, k - 1);//先把前面一部分内容逆置reverse_part(str, k, len - 1);//再把后面一部分内容逆置reverse_part(str, 0, len - 1);//最后把所有内容逆置//这就是三步逆置法}int main(){char str[] ABCDEFGH;puts(str);leftRound(str, 3);puts(str);}