Bootstrap

线性表练习之Example027-将一个 A[m+n] 的线性表中的后 n 个元素放在前 m 个元素的前面

Example027

原文链接:Example027

题目

已知在一维数组 A[m+n] 中依次存放两个线性表 (a1, a2, a3, ..., am)(b1, b2, b3, ..., bn)。编写一个函数,将数组中两个顺序表的位置交换,即将 (b1, b2, b3, ..., bn) 放在 (a1, a2, a3, ..., am) 的前面。

分析

本题考查的知识点:

  • 顺序表
  • 逆置顺序表

分析

  • 算法思想:将数组 A[m+n] 中的全部元素 [a1, a2, a3, ..., am, b1, b2, b3, ..., bn] 原地逆置为 [bn, b(n-1), b(n-2), ..., b1, am, a(m-1), a(m-2), ..., a1],再对前 n 个元素和后 m 个元素分别使用逆置算法,即可得到 [b1, b2, b3, ..., bn, a1, a2, a3, ..., am],从而实现顺序表的位置互换。

图解

请添加图片描述

C实现

核心代码:

/**
 * 逆置指定范围 [start, end] 内的数组元素
 * @param arr 数组
 * @param start 起始下标,包括本身
 * @param end 结束下标,包括本身
 */
void swap(int arr[], int start, int end) {
    for (int i = 0; i < (end - start + 1) / 2; i++) {
        int temp = arr[start + i];
        arr[start + i] = arr[end - i];
        arr[end - i] = temp;
    }
}

/**
 * 交换顺序表前 m 个元素的位置与后 n 个元素的位置
 * @param A 顺序表
 * @param m 前半部分元素个数
 * @param n 后半部分元素个数
 */
void exchange(int A[], int m, int n) {
    // 第一次逆置整个顺序表
    swap(A, 0, m + n - 1);
    // 第二次逆置前 n 个元素
    swap(A, 0, n - 1);
    // 第三次逆置后 m 个元素
    swap(A, n, m + n - 1);
}

完整代码:

#include <stdio.h>

/**
 * 逆置指定范围 [start, end] 内的数组元素
 * @param arr 数组
 * @param start 起始下标,包括本身
 * @param end 结束下标,包括本身
 */
void swap(int arr[], int start, int end) {
    for (int i = 0; i < (end - start + 1) / 2; i++) {
        int temp = arr[start + i];
        arr[start + i] = arr[end - i];
        arr[end - i] = temp;
    }
}

/**
 * 交换顺序表前 m 个元素的位置与后 n 个元素的位置
 * @param A 顺序表
 * @param m 前半部分元素个数
 * @param n 后半部分元素个数
 */
void exchange(int A[], int m, int n) {
    // 第一次逆置整个顺序表
    swap(A, 0, m + n - 1);
    // 第二次逆置前 n 个元素
    swap(A, 0, n - 1);
    // 第三次逆置后 m 个元素
    swap(A, n, m + n - 1);
}

/**
 * 打印数组
 * @param arr 数组
 * @param n 数组长度
 */
void print(int arr[], int n) {
    printf("[");
    for (int i = 0; i < n; i++) {
        printf("%d", arr[i]);
        if (i != n - 1) {
            printf(", ");
        }
    }
    printf("]\n");
}

int main() {
    int A[] = {1, 2, 3, 4, 5, 6, 7};
    int m = 4;
    int n = 3;
    print(A, m + n);

    // 调用函数交换位置
    exchange(A, m, n);
    print(A, m + n);
}

执行结果:

[1, 2, 3, 4, 5, 6, 7]
[5, 6, 7, 1, 2, 3, 4]

Java实现

核心代码:

    /**
     * 将数组中后 n 个元素与前 n 个元素交换位置
     *
     * @param arr 指定数组
     * @param m   前 m 个元素组成的线性表
     * @param n   后 n 个元素组成的线性表
     */
    public static void exchange(int[] arr, int m, int n) {
        // 第一次逆置整个顺序表
        swap(arr, 0, m + n - 1);
        // 第二次逆置前 n 个元素
        swap(arr, 0, n - 1);
        // 第三次逆置后 m 个元素
        swap(arr, n, m + n - 1);
    }

    /**
     * 逆置数组中 [start, end] 中的所有元素
     *
     * @param arr   指定数组
     * @param start 起始索引,包含本身
     * @param end   结束索引,包含本身
     */
    private static void swap(int[] arr, int start, int end) {
        while (start < end) {
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
            start++;
            end--;
        }
    }

完整代码:

public class Test {
    public static void main(String[] args) throws Exception {
        int[] A = new int[]{1, 2, 3, 4, 5, 6, 7};
        int m = 4;
        int n = 3;
        System.out.println(Arrays.toString(A));

        // 调用函数进行交换
        exchange(A, m, n);
        System.out.println(Arrays.toString(A));
    }

    /**
     * 将数组中后 n 个元素与前 n 个元素交换位置
     *
     * @param arr 指定数组
     * @param m   前 m 个元素组成的线性表
     * @param n   后 n 个元素组成的线性表
     */
    public static void exchange(int[] arr, int m, int n) {
        // 第一次逆置整个顺序表
        swap(arr, 0, m + n - 1);
        // 第二次逆置前 n 个元素
        swap(arr, 0, n - 1);
        // 第三次逆置后 m 个元素
        swap(arr, n, m + n - 1);
    }

    /**
     * 逆置数组中 [start, end] 中的所有元素
     *
     * @param arr   指定数组
     * @param start 起始索引,包含本身
     * @param end   结束索引,包含本身
     */
    private static void swap(int[] arr, int start, int end) {
        while (start < end) {
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
            start++;
            end--;
        }
    }
}

执行结果:

[1, 2, 3, 4, 5, 6, 7]
[5, 6, 7, 1, 2, 3, 4]
;