题目

从标准输入读入一个包含 n 个元素的整数数组和一个目标值 x,删除数组中所有取值等于 x 的元素,并输出压缩后的新数组。

输入格式:第一行输入数组长度 n;第二行输入 n 个整数;第三行输入待删除的目标值 x。

输出格式:第一行输出删除后剩余元素的个数;第二行输出压缩后的数组元素(若全部被删则第二行可为空),末尾换行。

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

思路与算法

1. 快慢双指针压缩
定义读指针 r(遍历原数组)和写指针 w(记录有效元素位置)。循环检查:若 a[r] != x,则保留写入 a[w++] = a[r]。

2. 原地算法优势
一次线性遍历 O(n) 即可完成原地覆盖压缩,写指针最终的值 w 即为删除后的新数组长度。

完整程序

#include <stdio.h>

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

    // 快慢指针原地删除:j 为慢指针,记录保留元素的新位置;i 为快指针遍历原数组
    int j = 0;
    for (int i = 0; i < n; i++) {
        if (a[i] != x) {
            a[j++] = a[i];
        }
    }

    // j 即为删除目标值后数组的新长度
    for (int i = 0; i < j; i++) {
        printf("%d%c", a[i], i + 1 < j ? ' ' : '\n');
    }
    return 0;
}

运行示例

输入:

6
1 2 3 2 4 2
2

输出:

1 3 4