题目

删除数组中所有值为 x 的元素并压缩

思路

本题删除数组中所有等于 x 的元素,并把剩余元素紧凑到数组前部。

用读下标 r、写下标 w 扫描:若 a[r]!=x 就复制到 a[w++]。结束后有效长度为 w,按题面输出或返回。

解题分析

双指针:i 扫描,j 指向下一个写入位置,不等于 x 的留下。稳定版(保持相对顺序)与非稳定(交换到尾部)按题意选择。

完整程序

#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);
    int j = 0;
    for (int i = 0; i < n; i++) {
        if (a[i] != x) {
            a[j++] = a[i];
        }
    }
    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