leetcode奇技淫巧 陣列七種去重技巧

2021-10-05 14:53:57 字數 2573 閱讀 6666

使用 list.contains() 方法

兩層迴圈暴力法

使用雜湊表

額外的方法

我們在刷 leetcode 時候經常會遇到陣列去重的問題,當然我這裡說的陣列去重也包括 string 字串去重,因為 string 可以 tochararray 嘛。那我們怎麼做呢?什麼樣的場景需要用何種方式呢?怎麼做才最高效呢?帶著這些疑問,我們來看看下面的 7 種實現方式,以及適用場景和特點介紹吧!

特點:簡單直接,但是去重後無序,既不是輸入的順序,也不是從小到大的排序

因此我們遇到僅僅是去重的場景,可以考慮到使用 hashset 去重的方式了

public

int[

]unique

(int

arr)

return result;

}

你要是寫成下面常規寫法當然也可以,注意這只是寫法不同,形式還是一樣的用 hashset 去重

public

int[

]unique

(int

arr)

int[

] result =

newint

[set.

size()

];iterator it = set.

iterator()

;int i =0;

while

(it.

hasnext()

)return result;

}

特點:簡單直接,去重後的迴圈和輸入的循序不一致,但是可以自動排好序,預設從小到大

因此,當我們遇到去重後需要從小到大排好序,就可以考慮到使用 treeset 去重了

public

int[

]unique

(int

arr)

return result;

}

特點:簡單直接,去重後的循序和輸入的順序一致,但是不是排好序的

因此對於需要保持陣列原有順序不變,就可以考慮到用 linkedhashset 來做了

public

int[

]unique

(int

arr)

return result;

}

特點:很容易理解,去重後和輸入的順序保持一致,是穩定的,但是最後若是輸出陣列,還要多出乙個迴圈

public

int[

]unique

(int

arr)

}int

result =

newint

[list.

size()

];int i =0;

for(

int a : list)

return result;

}

特點:比較麻煩,基本不會去這麼寫

這裡的思路是兩層迴圈遍歷,裡面這層迴圈是遍歷前面和當前有沒有相當,即重複的元素

public

int[

]unique

(int

arr)}if

(j == i)

}int

result =

newint

[list.

size()

];int i =0;

for(

int a : list)

return result;

}

特點:還是比較麻煩,基本不會這麼去用

這裡的思路是兩層迴圈,裡面的這層迴圈遍歷的次數少了,只遍歷去重了的前面的數字

public

int[

]unqiue

(int

arr)}if

(j == list.

size()

)}int[

] result =

newint

[list.

size()

];int i =0;

for(

int a : list)

return result;

}

特點:高效,寫起來可能稍微麻煩些,占用空間較大,輸出與輸入順序一致,且穩定

public

int[

]unique

(int

arr)

}int

result =

newint

[list.

size()

];int i =0;

for(

int a : list)

return result;

}

對於 string 型別資料,我建議轉成 char 來做,這樣要快一些,若直接使用 string 的話也能做,可以考慮 indexof() 方法和 contains() 方法,前者若子串存在返回第乙個的下標,第二個則是返回布林值,二者本質還是裡頭套著 for 迴圈去遍歷元素看找不找的到

git 奇技淫巧

例如 1.0.0 git tag a 1.0.0 m 1.0.0 版本的備註資訊.複製 git push origin tags 複製 例如 1.0.0 git tag d 1.0.0 複製 刪除遠端標籤需要先刪除本地標籤,再執行下面的命令 git push origin refs tags 1.0...

C 之奇技淫巧

typedef struct data 0 pdata 0 typedef struct data 1 pdata 1 結構體data 0與data 1在性質上沒有什麼不同,它們的size是相等的,都是8.但在用法上有很大區別。例 pdata 0 stack0 pdata 0 malloc max ...

c 的奇技淫巧

關於陣列 數論演算法技巧 stl其他 while scanf d d n,m eof 等價於 while scanf d d n,m 2 前者eof為檔案結束符,較保險 後者 後的數字為輸入的變數的個數 不能只寫while scanf d d n,m 這樣無法結束讀入 wwq大佬教的,希望我不要和他...