天天看点

【牛客-华为笔试练习】明明的随机数(对输入的数字利用TreeSet实现去重和排序)

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成 “去重”与“排序” 的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。

Input Param

n 输入随机数的个数

inputArray n个随机整数组成的数组

Return Value

OutputArray 输出处理后的随机整数

注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。

样例输入解释:

样例有两组测试

第一组是3个数字,分别是:2,2,1。

第二组是11个数字,分别是:10,20,40,32,67,40,20,89,300,400,15。

输入描述:

输入多行,先输入随机整数的个数,再输入相应个数的整数

输出描述:

返回多行,处理后的结果

示例1

3
2
2
1
11
10
20
40
32
67
40
20
89
300
400
15
           

输出:

1
2
10
15
20
32
40
67
89
300
400
           

参考代码

去重:选择Set(无序、不重复)

排序:对Set的数组进行排序,最方便的使用集合TreeSet(不重复、有序),将集合中的元素放到数组中,利用Java提供的排序函数 Arrays.sort() 进行排序。

import java.util.*;
public class Main {
    public static void main(String []args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int n = scanner.nextInt();
            Set<Integer> set = new TreeSet<>();
            while (n != 0){
                int i = scanner.nextInt();
                set.add(i);
                n--;
            }
            Integer[] arr = {};
            arr = set.toArray(arr);
            Arrays.sort(arr);
            for (Integer integer : arr){
                System.out.println(integer);
            }
        }
    }
}

           

扩展:

Set 集合的特点:

  • Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。
  • ​ Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不会同时接受这两个对象。

Set集合的分类

Set集合主要分为3种:

​ |——SortedSet接口——TreeSet实现类

Set接口——|——HashSet实现类

​ |——LinkedHashSet实现类

  • HashSet(无序,可null)

    HashSet的特点是不能保证元素的排列顺序,顺序有可能发生变化,集合元素可以是null,但只能放入一个null。因为在HashSet中存入一个元素的时候,会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置,所以储存位置是随机的。HashSet就好像是HashMap的key。

  • TreeSet(有元素顺序的)

    TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。一般的Set排序都会使用到TreeSet。

  • LinkedHashSet(记录插入顺序)

    LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺 序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。一般的,如果让你设计一个缓存算法,LinkedHashSet就是基本的基础,利用LRU,筛选出应该淘汰的元素。

由于TreeSet是有元素顺序的,因此我们在排序的过程中都会使用TreeSet。

小结:

前提:结合中元素不重复

  1. 如果我们需要将不重复的元素排序, 那么使用TreeSet
  2. 如果我们不需要排序, 使用HashSet, HashSet比TreeSet效率高
  3. 如果我们需要保留存储顺序,又要过滤重复元素,那么使用LinkedHashSet

注:BigDecimal类的排序方法和使用方法如下:

https://blog.csdn.net/qq_42145871/article/details/89460888

必看:TreeSet的两种排序方法:自然排序和自定义排序