华为机考题:明明的随机数

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 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;
}
相关推荐
罗湖老棍子1 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
stsdddd4 小时前
YOLO算法建筑工地安全帽目标检测数据集16881张:标注核对笔记
算法·yolo·目标检测
CV爱数码4 小时前
论文精读|Learned Primal-Dual:把原始–对偶算法展开成网络
图像处理·算法·计算机视觉·ct·重建·断层扫描
yuniko-n5 小时前
【算法】约瑟夫环问题
java·算法
郝亚军5 小时前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
l1t5 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
Nil2085 小时前
LeetCode 283移动零
数据结构·算法·leetcode
CQU_JIAKE5 小时前
10.18【A】
算法
LMT流氓兔6 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
物联网软硬件开发-轨物科技7 小时前
【轨物方案】深度解读开关柜智能感知及一键顺控专家系统
大数据·运维·网络·人工智能·算法·机器人