天天看點

【牛客-華為筆試練習】明明的随機數(對輸入的數字利用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的兩種排序方法:自然排序和自定義排序