• 【限时免费】20天拿下华为OD笔试之【哈希集合】2023B-明明的随机数【欧弟算法】全网注释最详细分类最全的华为OD真题题解


    题目描述与示例

    题目描述

    明明生成了N1500 之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。

    数据范围: 1 ≤ N ≤ 1000 ,输入的数字大小 val 满足 1 ≤ val ≤ 500

    输入描述

    第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数

    输出描述:

    输出多行,表示输入数据处理后的结果。

    示例 1

    输入

    3
    2
    2
    1
    
    • 1
    • 2
    • 3
    • 4

    输出

    1
    2
    
    • 1
    • 2

    说明

    输入解释: 第一个数字是 3,也即这个样例的 N = 3,说明用计算机生成了 31500 之间的随机整数,接下来每行一个输入随机数字,共 3 行,也即这 3 个随机数字为:2 2 1

    输出解释:2 2 1中,出现了重复的2,只需要输出一个2即可,而且要按照从小到大的顺序输出全部整数,即依次输出1 2

    解题思路

    这道题直接运用哈希集合不包含重复元素的性质,将每一个整数都加入哈希集合num_set中。

    由于哈希集合是一种无序的数据结构,为了从小到大依次输出所有元素,需要在所有元素输入完毕之后,将哈希集合num_set转化为列表num_lst。对列表num_lst就可以进行排序了,排序完成后,在一个for循环内依次输出num_lst中的所有元素即可。

    代码

    Python

    # 题目:2023Q1A-明明的随机数
    # 分值:100
    # 作者:闭着眼睛学数理化
    # 算法:哈希集合
    # 代码有看不懂的地方请直接在群上提问
    
    N = int(input())
    
    # 初始化一个哈希集合num_set,用于储存所有不重复元素
    num_set = set()
    
    # 遍历N次,依次输入数字
    for _ in range(N):
        num_set.add(int(input()))
    
    # 哈希集合是无序的数据结构,所以要将哈希集合转化为列表后再排序
    num_lst = list(num_set)
    # 对列表进行排序
    num_lst.sort()
    
    # 遍历num_lst中的所有元素,按照从小到大的顺序依次输出
    for num in num_lst:
        print(num)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    Java

    import java.util.HashSet;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            
            int N = scanner.nextInt();
            HashSet<Integer> num_set = new HashSet<>();
            
            for (int i = 0; i < N; i++) {
                num_set.add(scanner.nextInt());
            }
            
            ArrayList<Integer> num_lst = new ArrayList<>(num_set);
            Collections.sort(num_lst);
            
            for (int num : num_lst) {
                System.out.println(num);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    C++

    #include 
    #include 
    #include 
    #include 
    
    int main() {
        int N;
        std::cin >> N;
        
        std::unordered_set<int> num_set;
        
        for (int i = 0; i < N; i++) {
            int num;
            std::cin >> num;
            num_set.insert(num);
        }
        
        std::vector<int> num_lst(num_set.begin(), num_set.end());
        std::sort(num_lst.begin(), num_lst.end());
        
        for (int num : num_lst) {
            std::cout << num << std::endl;
        }
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    时空复杂度

    时间复杂度:O(NlogN)。排序所需的时间复杂度。

    空间复杂度:O(N)。哈希集合所占的额外空间。


    华为OD算法/大厂面试高频题算法练习冲刺训练

    • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

    • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

    • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

    • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

    • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

    • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

    • 绿色聊天软件戳 od1336了解更多

  • 相关阅读:
    Go语言入门心法(五): 函数
    分库分表与sharding-jdbc
    html和css语法记录
    C语言执行过程
    一、CSS弹性布局[弹性盒子、弹性元素]
    Linux之定时任务
    AcWing第78场周赛
    Qt如何QProgressDialog如何屏蔽按键Esc及空格键
    codeblock图形界面编程(五)基于ege库的数据采集波形绘图
    创建型模式-原型模式
  • 原文地址:https://blog.csdn.net/weixin_48157259/article/details/134772537