方法一:双指针算法
#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;
}