方法一:双指针算法

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
int a[110];
int b[110];
int j,p;

int main()
{
    int n;
    scanf("%d",&n);
    for (int i = 0;i < n;i++) scanf("%d",&a[i]);

    //先排序再去重
    sort(a,a + n);

    //要注意边界问题p <= n - 1,可举例理解
    for (p = 0;p <= n - 1;)
    {
        //用p指针遍历数组,q指针指向p的下一个位置
        int q = p + 1;
        if (a[p] == a[q])
        {
            //若相邻两数相等,将其中一个数赋值到新数组中
            //然后p指针跳到q指针的下一个位置
            b[j] = a[p];
            p = q + 1;

            //j指针用来维护新数组
            j++;

            //处理类似1 1 1 1 1 1 2 2 3 3的情况(容易漏)
            //若p指针所指向的数已存在于新数组之中,p一直后移
            while (a[p] == b[j - 1]) p++;
        }
        else
        {
            //若两数不相等,将第一个数赋值到新数组,然后p指针后移
            b[j] = a[p];
            p++;
            j++;
        }
    }
    printf("%d\n",j);

    //输出新数组
    for (int c = 0;c < j ;c++) printf("%d ",b[c]);
    return 0;
}

方法二:桶排序

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1010;
int a[N];
int n,ans;

int main()
{
    scanf("%d",&n);
    for (int i = 0;i < n;i++)
    {
        int x;
        scanf("%d",&x);

        //该桶初始时没装数
        if (a[x] == 0)
        {
            a[x] = 1;
            ans += 1;
        }
    }

    printf("%d\n",ans);

    //遍历桶
    for (int j = 0;j < N;j++)
        if (a[j] != 0) printf("%d ",j);

    return 0;
}