這是日常工程中,經常會遇到的場景,拿到2個list,里面有重復元素,要求去重合並最終排序輸出。
題目:2個數組,比如[1,1,6,8] , [6,8,9,1,10,4],要求合並去重並排序,即最終變成[1,4,6,8,9,10]
思路1 :TreeSet
實際java工程中,最直觀的想法,就是利用現成的集合類TreeSet
public static void main(String[] args) {
int[] a = new int[]{1, 1, 6, 8};
int[] b = new int[]{6, 8, 9, 1, 10, 4};
Set<Integer> set = new TreeSet<>();
for (int i = 0; i < a.length; i++) {
set.add(a[i]);
}
for (int i = 0; i < b.length; i++) {
set.add(b[i]);
}
System.out.println(set);
}
全扔進去就完事了,但是從算法角度,並非最優題。TreeSet內部是采用HashMap加其它一堆復雜結構完成的。
思路2:類似桶排序的空間換時間解法
如果已知數值的大小范圍,比如0-100,可以預選創建一個長度為100的空數組,每個值默認初始為0,下標索引對應0-100之間的數字。把2個數組跑一次,在相應的索引位置位,值+1,相當於做標識,O(N)就能搞定
public static void main(String[] args) {
int[] a = new int[]{1, 1, 6, 8};
int[] b = new int[]{6, 8, 9, 1, 10, 4};
int[] temp = new int[100];
for (int i = 0; i < a.length; i++) {
temp[a[i]] += 1;
}
for (int i = 0; i < b.length; i++) {
temp[b[i]] += 1;
}
for (int i = 0; i < temp.length; i++) {
if (temp[i] > 0) {
System.out.print(i + "\t");
}
}
}
思路3:老老實實的循環遍歷
這是最差解法,只是列下思路,先弄1個新數組(大小為2個數組size合),然后1個個循環,把不重復的依次放入,最后把把前面N個有效值,取出來排序。
