2、设计一个时间复杂度为0(n)的算法,实现将数组arr[n]中所有元素循环左移k个位置。请填空,运行结果如下图所示:(在运行结果中体现自己的姓名和两位学号。)
【以下回答由 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. 最后打印出姓名和学号,并输出结果。
【相关推荐】