题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N ≤ 1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。
请你协助明明完成"去重"与"排序"的工作。
输入描述
第 1 行为 1 个正整数
N,表示所生成的随机数的个数。第 2 行有
N个用空格隔开的正整数,为所产生的随机数。
输出描述
输出为多行,每行一个正整数,为从小到大排好序的不相同的随机数。
示例
输入:
text
5 8 8 5 3 5
输出:
text
3 5 8
C 语言解决方案
思路
利用桶排序(计数数组)思想:
因为数字范围固定在
1 ~ 1000,开辟一个大小为1001的数组bucket,初始化为 0。每读入一个数字
x,就令bucket[x] = 1(天然实现去重)。最后从
1到1000遍历数组,凡是值为1的下标即为去重排序后的结果,依次输出。
这种方法比"读入后排序再手工去重"更简洁高效。
代码实现
c
#include <stdio.h> #include <string.h> int main(void) { int n; // 多组输入处理(部分华为机考为多组测试数据) while (scanf("%d", &n) != EOF) { int bucket[1001]; memset(bucket, 0, sizeof(bucket)); // 清零 for (int i = 0; i < n; i++) { int x; scanf("%d", &x); bucket[x] = 1; // 标记出现,自动去重 } // 按从小到大顺序输出所有出现过的数字 for (int i = 1; i <= 1000; i++) { if (bucket[i]) { printf("%d\n", i); } } } return 0; }