一、暴力求解法
算法思想:比如一个字符串abcdef,向走旋转2个字符,
分为三步:1, 左旋转一个字符
2, 后面的字符往前移
3, 将开始移的字符移到最后
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define NUM 3
void reverse(char* arr, int y) {
assert(arr);
int len = strlen(arr);
for (int i = 0; i < y; i++) {
//左旋转一个字符
char tmp = *arr;
//后面的字符往前移
for (int j = 0; j < len - 1; j++) {
*(arr + j) = *(arr + j + 1);
}
//将开始的字符移到最后
*(arr + len - 1) = tmp;
}
}
int main() {
char arr[] = "abcdef";
int k = NUM;
reverse(arr, NUM);
printf("%s\n", arr);
return 0;
}
二、三步反转法
算法思想:比如一个字符串abcdef,向左旋转2个字符
1,先将前面的2个字符旋转->bacedf
2,再将后面剩余的字符旋转->bafdec
3, 最后旋转整个字符串->cedfab
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define NUM 2
//三步反转法
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) {
assert(arr);
int len = strlen(arr);
assert(k < len);
reverse(arr, arr + k - 1);//逆序左边
reverse(arr + k, arr + len - 1);//逆序右边
reverse(arr, arr + len - 1);//逆序整个字符串
}
int main() {
char arr[] = "abcdef";
int k = NUM;
left_move(arr, NUM);
printf("%s\n", arr);
return 0;
}
温馨提醒:assert的使用是传一个空字符串以及旋转字符的个数大于已给字符的长度