☰
华为机考题:明明的随机数
2026/10/1 16:05:15 网站建设 项目流程

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N ≤ 1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。

请你协助明明完成"去重"与"排序"的工作。

输入描述

  • 第 1 行为 1 个正整数N,表示所生成的随机数的个数。

  • 第 2 行有N个用空格隔开的正整数,为所产生的随机数。

输出描述

输出为多行,每行一个正整数,为从小到大排好序的不相同的随机数。

示例

输入:

text

5 8 8 5 3 5

输出:

text

3 5 8

C 语言解决方案

思路

利用桶排序(计数数组)思想:

  1. 因为数字范围固定在1 ~ 1000,开辟一个大小为1001的数组bucket,初始化为 0。

  2. 每读入一个数字x,就令bucket[x] = 1(天然实现去重)。

  3. 最后从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; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询