方法一:三步反转法

#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;
}

左旋转k个字符,三种方法_三步反转法