左旋字符串(一般解法)
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
//void rotate_left(char* str, int k)
//{
// assert(str);
//
// while (k--)//控制旋转次数
// {
// //先写旋转一次的思路:把第一个字符保留,依次把后面的字符往前移动一位
// char tmp = *str;//保留第一个字符
// char* cur = str;//把指针传给一个新定义的指针进行操作
// while (*(cur + 1) != '\0')
// {
// *cur = *(cur + 1);
// ++cur;
// }
// *cur = tmp;
// }
//}
// //时间复杂度为O(N^2),不建议使用
//int main()
//{
// char a[] = "ABCDE";
// printf("%s\n", a);
//
// rotate_left(a, 3);
//
// printf("%s\n", a);
//
// return 0;
//}
//左旋字符串(进阶解法)
//分两块单独逆置,在全部再逆置
举例如下:
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
//void reverse_str(char* left, char* right)//逆置函数
//{
// while (left < right)
// {
// char tmp = *left;
// *left = *right;
// *right = tmp;
//
// ++left;
// --right;
// }
//}
//
//void rotate_left(char* str, int k)
//{
// assert(str);
//
// // ABCDE
// int len = strlen(str);
// // k len-k
// //[0,k-1][k,len-1]
// reverse_str(str, str + k - 1);//先分两段逆置
// reverse_str(str+k, str + len - 1);
//
// reverse_str(str, str + len - 1);//再整体逆置
//}
//
//int main()
//{
// char a[] = "ABCDE";
// printf("%s\n", a);
//
// rotate_left(a, 3);
//
// printf("%s\n", a);
// return 0;
//}