左旋转k个字符,两种方法

时间:2021-11-22 00:56:26

方法一:三步反转法

#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);
//左旋k个字符
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;
}