关于#c语言#的问题,请各位专家解答!

2、设计一个时间复杂度为0(n)的算法,实现将数组arr[n]中所有元素循环左移k个位置。请填空,运行结果如下图所示:(在运行结果中体现自己的姓名和两位学号。)

img

【以下回答由 GPT 生成】

#include <stdio.h>

void reverse(int arr[], int start, int end) {
    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}

void rotateArray(int arr[], int n, int k) {
    k = k % n;
    reverse(arr, 0, k-1);
    reverse(arr, k, n-1);
    reverse(arr, 0, n-1);
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 2;

    rotateArray(arr, n, k);

    printf("姓名:张三,学号:01\n");
    printf("运行结果:");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

算法解释: 1. 首先定义一个辅助函数reverse,用于反转数组中指定区间的元素。 2. 在rotateArray函数中,对k进行取余操作,以防止k大于n的情况。 3. 首先将前k个元素进行反转。 4. 然后将剩余的n-k个元素进行反转。 5. 最后将整个数组进行反转,即得到循环左移k位后的结果。 6. 在main函数中,定义了一个数组arr和相关变量n和k,并调用rotateArray函数进行循环左移。 7. 最后打印出姓名和学号,并输出结果。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^