一.問題描述
在實際程式設計中我們經常遇到「去掉重複數字」等類似的問題,也就是「
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,如果下乙個節點和當前節...