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

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 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;
}
相关推荐
AI备忘录1 小时前
(二十三)华为华三锐捷迈普思科 MLAG 跨设备配置命令(双活网关五厂商对照)
服务器·网络·华为
Doubbbbbbble云1 小时前
多维空间索引结构R树与KD树性能对比研究4
算法
海上小飞龙1 小时前
【KMP算法-中篇】next 数组的递推:往前填一位,靠的是往回退几步
算法
lusklusklusk1 小时前
Python 四大数据结构详解:元组、列表、集合、字典的特点与增删改查
数据结构·windows·python
keyipatience2 小时前
B树详解:从零构建平衡多路搜索树
数据结构·b树·算法·图搜索
FluxArt2 小时前
GPT Image 2.5 多图参考怎么用:Flux Art 生成与编辑教程
数据结构·gpt·算法
All for pursuit.2 小时前
【分治-2】215.数组中的第K个最大元素
数据结构·c++·算法·leetcode
CQU_JIAKE3 小时前
9.15【A】
算法·动态规划
成为深度学习高手3 小时前
DAG:沿时间与通道双相关建模的外生变量时序预测
网络·人工智能·深度学习·算法·机器学习·数据挖掘·时序数据库