题目

从标准输入读入 n 个整数存入数组,将数组中的所有元素就地逆序排列,并输出逆序后的数组。

输入格式:第一行输入元素个数 n;第二行输入 n 个整数,以空格分隔。

输出格式:在一行中输出逆序后的数组元素,每个数字后跟空格,末尾换行。

数据范围与约定:1 ≤ n ≤ 1000。

思路与算法

1. 双指针相向收缩
设置左指针 i = 0 和右指针 j = n - 1。当 i < j 时,交换 a[i] 与 a[j],然后 i++; j--;。

2. 原地算法空间复杂度
该方法在原数组上直接修改,空间复杂度为 O(1),时间复杂度为 O(n)。无需借助第二个辅助数组。

完整程序

#include <stdio.h>

int main(void)
{
    int n, a[1000];
    if (scanf("%d", &n) != 1 || n < 1 || n > 1000) {
        return 1;
    }
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    // 双指针对向碰撞:i 指向头部,j 指向尾部,对称元素两两交换
    for (int i = 0, j = n - 1; i < j; i++, j--) {
        int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

    for (int i = 0; i < n; i++) {
        printf("%d%c", a[i], i + 1 < n ? ' ' : '\n');
    }
    return 0;
}

运行示例

输入:

5
1 2 3 4 5

输出:

5 4 3 2 1