明明的随机数
明明的随机数
https://ac.nowcoder.com/acm/problem/16669
方法一:双指针算法
#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; }