📜  C测验– 110 |问题5(1)

📅  最后修改于: 2023-12-03 15:00:12.733000             🧑  作者: Mango

C测验-110 | 问题5

问题描述

有一个长度为N的整型数组,其中N为偶数,将数组前一半与后一半元素位置交换,返回交换后的数组。例如,原数组为{1,2,3,4,5,6},交换后的数组为{4,5,6,1,2,3}。

示例
int arr[] = {1,2,3,4,5,6};
int n = sizeof(arr)/sizeof(arr[0]);
int* result = swap_half_array(arr, n);
for(int i=0; i<n; i++){
    printf("%d ", result[i]);
}

输出结果:

4 5 6 1 2 3
要求
  • 对于输入的数组和返回的交换后的数组,都应该采用动态内存分配。
  • 不要将原有数组完全复制一遍,也就是说,不要开辟一个新的数组空间。
关键思路
  • 利用一个中间数组,将原数组前一半(arr[0]~arr[n/2-1])拷贝到中间数组的后一半(arr[n/2]~arr[n-1])中。
  • 将原数组后一半(arr[n/2]~arr[n-1])拷贝到中间数组的前一半(arr[0]~arr[n/2-1])中。
  • 返回中间数组。
代码实现
/**
 * 交换数组前一半与后一半元素位置
 * @param arr 整型数组首元素指针 
 * @param n 数组长度
 * @return 返回交换后的数组(动态分配空间)
*/
int* swap_half_array(int* arr, int n){
    int* tmp_arr = (int*)malloc(sizeof(int) * n); //中间数组
    int half_n = n / 2; //数组长度的一半
    //拷贝arr[0]~arr[n/2-1]到tmp_arr[n/2]~tmp_arr[n-1]中
    memcpy(tmp_arr + half_n, arr, sizeof(int) * half_n);
    //拷贝arr[n/2]~arr[n-1]到tmp_arr[0]~tmp_arr[n/2-1]中
    memcpy(tmp_arr, arr + half_n, sizeof(int) * half_n);
    return tmp_arr;
}

以上就是本题的解答思路和代码实现。注意要使用动态内存分配并掌握 memcpy() 函数的使用。