题目来源:[NOIP2006 普及组] 明明的随机数 - 洛谷
解题思路:这道题的解题方法有很多,由于随机数的范围是 1 到 1000,范围比较小。可以用计数排序。同时快排和二分查找也能用,二分查找之前刷了不少题,就不写这部分的代码了。下面主要用计数排序和快排的思想来完成。
解法1 计数排序
对于本题,可以创建一个大小为 1001 的数组(假设数组下标从 1 开始,到 1000),用于计数每个数字出现的次数。然后,遍历计数数组,输出非零计数的索引(即原数组中的唯一数字)。
#include <iostream>
#include <cstring> // For memset
using namespace std;
int main() {
int N;
cin >> N;
int count[1001]; // 数组大小为 1001(1 到 1000)
memset(count, 0, sizeof(count)); // 初始化为 0
// 读取数字并计数
for (int i = 0; i < N; ++i) {
int num;
cin >> num;
count[num]++;
}
// 计算不同数字的个数
int M = 0;
for (int i = 1; i <= 1000; ++i) {
if (count[i] > 0) {
M++;
}
}
cout << M << endl;
// 输出不同的数字
for (int i = 1; i <= 1000; ++i) {
if (count[i] > 0) {
cout << i << " ";
}
}
return 0;
}
解法2 排序
这里用STL库中的sort()函数来完成。
#include<iostream>
#include<algorithm>
using namespace std;
//快排
int main()
{
int N,a[100];
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> a[i];
}
sort(a, a + N);//排序
int b[100];//创建另一个数组,存放不重复的数字
int count = 0;
for (int i = 0; i < N; i++)
{
if (i == 0 || a[i] != a[i - 1])
{
b[count++] = a[i];
}
}
cout << count << endl; //返回不重复的元素个数
for (int i = 0; i < count; i++)
{
cout << b[i] << " ";
}
return 0;
}
书上的代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int const MAXN = 1010;
int a[MAXN], ans[MAXN], n, cnt = 0, tmp = -1;
int main()
{
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
for (int i = 0; i < n; i++)
{
if (a[i] != tmp)ans[cnt++] = a[i];//当前的和上一个不同才复制到新数组
tmp = a[i];
}
cout << cnt << endl;
for (int i = 0; i < cnt; i++)cout << ans[i]<<" ";
return 0;
}