去掉陣列中重複出現元素的演算法

2021-07-24 02:25:17 字數 2088 閱讀 4329

一.問題描述

在實際程式設計中我們經常遇到「去掉重複數字」等類似的問題,也就是「

remove the duplicate

」問題。例如在「

建立某個統計樣本時,要去掉重複的元素

」。下面將給出這類問題的解決思路。

二.解決思路

解決上述問題基本上有三種思路:

第一種

使用map容器過濾掉重複元素(適用於整形資料、字串等)

第二種:利用陣列進行去重,

首先對該組資料進行

排序

,然後從頭遍歷陣列,判斷當前位置的資料和下乙個位置的資料是否重複,若不重複,新增下一位中的資料到過濾後的陣列中,並把比較的基準資料設定為剛加入的這個資料,然後繼續進行比較。若重複,則跳過該資料去比較後面的(也可以做字串的比較),需要使用兩個指標(乙個基準指標,乙個游標指標);

第三種:

是對第二種方法的改進,第二種方法需要開闢新的空間儲存過濾後的元素,此方法中不需要開闢空間,只需用陣列中沒有重複的元素把重複的元素覆蓋,過程如下:

(1)基準指標首先指向陣列第0個位置,游標指標指向第1個位置,比較兩指標所指向的資料是否相等,若相等,游標指標向後移一位,基準指標不動,再次比較;若不相等,游標指標所指向的資料複製到基準指標的下一位,基準指標和游標指標各自從當前位置向後移一位,再次比較;

(2)終止條件:游標指標超過陣列的最後一位;

(3)當前基準指標之前的一段陣列則為去重後的陣列(包括基準指標所指向的元素);

三.**實現

1.map容器去重實現**

#include#includevoid inserttomap(int *a, int n,std::map&outmap);

void sprintmap(std::map&coutmap);

void main()

; std::mapresultmap;

inserttomap(a, 10, resultmap);

sprintmap(resultmap);

system("pause");

}void inserttomap(int *a, int n, std::map&outmap)

); if (!ret.second)

}outmap = testmap;

}void sprintmap(std::map&coutmap)

; std::sort(&a[0], &a[9]+1);//陣列排序

int scount;//過濾後陣列的有效位長度

removemultip(a, 10, scount);

for (int i = 0; i <= scount; i++)

system("pause");

}void removemultip(int *a, int n,int &cout)

{ if (n <= 1)return;

int start = 0;//基準位置

int end = 1; //游標位置

while (end四.思想總結

1.map容器去重的思想

借助map容器中不能插入重複key值的特性進行

常數

或者字串

陣列去重,又借助map.insert函式的返回值的標識可以統計重複元素出現的個數(在統計一組資料中出現次數最多的元素非常有用); 2.

不開闢陣列空間去重的思想

在去重操作實施前要保證資料的有序性,然後通過兩個指標在原陣列上面進行剔除重複元素,最後擷取陣列,得到去重後的陣列;

演算法(一) 求集合中重複出現或者不重複出現的數值

求法一 利用異或 兩個相同的數進行異或,結果為0 將集合中所有的元素進行異或運算,得到的結果為最終的唯一重複的數或者唯一不重複的數,原因 a b c d a c b a a b b c c d d,例子 乙個集合中只有乙個數是只出現一次,其他數出現兩次 public intsinglenumber ...

刪除有序鍊錶中重複出現的元素

給出乙個公升序排序的鍊錶,刪除鍊錶中的所有重複出現的元素,只保留原煉表中只出現一次的元素。例如 給出的鍊錶為1 2 3 3 4 4 5,返回1 2 5.給出的鍊錶為1 1 1 2 3,返回2 3.struct listnode class solution listnode phead new li...

刪除鍊錶中的所有重複出現的元素

刪除給出鍊錶中的重複元素 鍊錶中元素從小到大有序 使煉表中的所有元素都只出現一次 例 1 1 1 2 3,返回2 3 思路 1,如果下乙個節點和當前節點值相同,則刪除下乙個節點 刪除步驟 1.1,當前節點的下乙個為下乙個節點的下乙個 1.2,下乙個節點指向當前節點的下乙個 2,如果下乙個節點和當前節...