數組去重演算法
⑴ 有序數組去重的幾種演算法
這個問題的意思是,如果假設一個數組中存在重復的數據項,那麼就中保留重復數據項中的一個。也就是說最終輸出的結果數組中不容許存在重復數據項,所以因為這里涉及到重復數據項的問題,所以立馬想到了集合(Set)這個數據結構,因為它是不容序存在重復數據項的數據結構,
思路1.也就是將數組中的所有元素插入到一個Set中,利用Set的自動剔除重復數據項的功能,將導致所有重復數據項沒有辦法插入成功,也就是add方法
返回false,然後調用toArray方法,返回這個集合所對應的數組。那麼這個數組就是一個沒有重復數據項的數組,利用這個方法,通過比較結果數組和
源數組之間的大小,查看源數組中到底是否存在重復數據項。
思路2.除了利用Set這個數據結構不容序存在重復數據項的功能之外,還有一種很容易想到的方法,也就是對整個數組進行排序,然後遍歷排序之後的數組,將重復數據項,清除掉。
思路1的實現:
public static int[] noDup(int[] array) {
Set<Integer> set = new
HashSet<Integer>();
for (int i :
array)
set.add(i);
Integer[]
integers = (Integer[]) set.toArray();
int[] result
= new int[integers.length];
for (int i =
0; i < integers.length; i++)
result[i] =
integers[i];
return
result;
}
思路2的實現:
使用快速排序等演算法對數組進行排序,這個排序過程不在介紹。假設下面這個演算法的輸入是一個幾經排好序的數組。
for (int i = 0; i < array.length - 1; i++) {
if (array[i]
== array[i + 1]) {
array[i] =
-1;
}
}
通過上面這段代碼就能夠實現把數組中所有的重復數據項只保留一個,其它的置為-1或者根據實際情況置成其它值。然後遍歷數據,刪除所有位-1的數據項,並且將數組中包含的記錄個數不斷減少即可。
⑵ 關於如何去除數組中重復項
數組去重,就是在數組中查找相同的元素,保留其中一個,去除其他元素的程。
從這句話揭示了數組去重的兩個關鍵因素:
找到重復項
去除重復項
本文告訴你在遇到去重問題時該如何思考,並以 JavaScript 為例,進行詳細解釋。使用 JavaScript 示例主要是因為它環境比較好找,而且直接對象 (Plain Object) 用起來很方便。
JavaScript 的環境:Node.js 或者瀏覽器的開發者控制台。
找到重復項
找到重復項最關鍵的演算法是判定元素是否相同。判定相同,說起來似乎很簡單 —— 用比較運算符就好了嘛!真的這么簡單嗎?
用 JavaScript 來舉個例:
const a = { v: 10 };
const b = { v: 10 };
肉眼觀察,這里的a和b相同吧?但是 JavaScript 不這么認為:
console.log(a == b); // false
console.log(a === b); // false
肉眼觀察和程序比較使用了不同的判斷方法。肉眼觀察很直接的採用了字元串比對的方法,而程序壓根沒管是不是數據相同,只是直接判斷它們是不是同一個對象的引用。我們一般會更傾向於使用符合人眼直觀判斷的方法,所以可能會想到使用JSON.stringify()把對象變成字元串來判斷:
console.log(JSON.stringify(a) === JSON.stringify(b)); // true
現在如果我們把a和b略作改變,又該如何?
const a = { v: 10, n: "1" };
const b = { n: "1", v: 10 };
乍一看,a和b不同。用JSON.stringify()的結果來比對,也確實不同。但是仔細一看,他們的屬性是完全相同的,唯一的區別在於屬性的順序不一樣。那麼到底順序應不應該作為一個判斷相同的依據呢?
這個問題現在真沒法回答。「該如何」取決於我們的目標,也就是業務需求。
從上面的例子我們可以了解:判斷相同並不是一個簡單的事情,根據不同的業務要求,需要選擇不同的判斷方法;而不同的判斷方法,可能產生不同的判斷結果。
接下來先講講常見的判斷方法。
最直接的:比較運算符
比較運算符主要用於比較基本類型的值,比如字元串、數、布爾等。
普通比較運算符 (==) 在比較不同類型的值時,會先把它們轉換為相同類型再來比較;而嚴格比較運算符 (===) 則更為嚴格,會直接將類型不同值判定為不同。這些都是基本的 JavaScript 語法知識。現代開發中為了能更好的利用工具,除極少數特殊情況外,都應該使用===來進行判斷。尤其是在 TypeScript 中,幾乎都不會出現==了。
JavaScript 中,比較運算符不會比較對象屬性,只會比較對象的引用是否相同。如果要比較對象具體信息,需要用到接下來講到的方法。