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

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 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;
}
相关推荐
GoAI3 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi3 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M6 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen6 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
SoFarAway7 小时前
拆解华为一碰传
华为·逆向
心仪久了会沦陷8 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方8 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん9 小时前
【C++】哈希表
c++·算法·散列表
码少女9 小时前
数据结构——图的基础
数据结构