方法一:三步反转法
#include<stdio.h>
#include<string.h>
#include<assert.h>
void rever(char arr1[], char arr2[]) {
assert(arr1);
assert(arr2);//判断非空指针
char* left = arr1;
char* right = arr2;
while (left < right) {//左小于右时
char temp = *left;//交换
*left = *right;
*right = temp;
left++;
right--;
}
}
//主体思路
void rever_left(char arr[], int n) {
int len = strlen(arr);
rever(arr, arr + n - 1);//左旋前半部分
rever(arr + n, arr + len - 1);//左旋右半部分
rever(arr, arr + len - 1);//整体左旋
}
int main() {
char arr[] = "abcdefg";
int n = 0;
scanf_s("%d", &n);
//左旋n个字符
rever_left(arr, n);
printf("%s", arr);
return 0;
}
方法二:首先把第一个字符拿出,其余向前推进,最后将第一个字符填入最后,重复此步骤k次
#include<stdio.h>
#include<string.h>
#include<assert.h>
void rever_left(char arr[], int n) {
assert(arr);//判断非空指针
int len = strlen(arr);
int i = 0;
for (i = 0; i < n; i++) {
int j = 0;
char temp = *arr;//记住首个字符
for (j = 0; j < len - 1; j++) {//依次向前推进
*(arr + j) = *(arr + j + 1);
}
*(arr + len - 1) = temp;//赋予最后首个字符
}
}
int main() {
char arr[] = "abcdefg";
int n = 0;
scanf_s("%d", &n);
//左旋k个字符
rever_left(arr, n);
printf("%s", arr);
return 0;
}