在題目中有序表也就是數組,下面是一個由小到大排列起來的數組,其中含有某些重複的元素。現在,我們的目的是把數組中重複的元素删除掉。
為了方便,考慮設置兩個指針變量分别為i和j,從左到右依次進行遍曆。假如i記錄要留下的元素的個數;j記錄所有訪問到的元素個數。i始終落後于j,也就是i<=j。這樣把後面的元素賦值給前面的元素,L.data[i]=L.date[j]就不會産生重複值的元素,從而達到删除所有重複元素的目的。
具體的代碼算法如下:
bool DeleteSame(SeqList &L) {
if(L.length == 0) return false; //出口條件放在第一句,程序執行的更快,代碼簡潔明了
int i,j;// i 訪問到要留下的元素,j訪問到全部的元素
for(i = 0,j = 1;j < L.length;j )
if(L.data[i] != L.data[j]) // 查找下一個與上個元素值不同的元素
L.data[ i] = L.data[j]; //找到後。則将元素前移
L.length = i 1;// i是數組下标,從0開始,要反映數組的長度要加1,下标與長度相差1的關系
return true;
}
程序中j問什麼要從1始執行,這是因為不管0号元素與1号元素是否相同,0号元素始終要留下的,而删除重複值的元素要從1号元素起。
當程序進入for循環體中的if語句,先進行第一個元素1和第二個元素2進行比較,如果發現兩個數不相同,也就是兩個值不重複,那麼這兩個數都可以留下。默認的情況下,第一個元素是要留下的。
當執行到L.data[ i] = L.data[j]語句時, i從0自動變成了1,此時j也是1。這樣L.data[1] = L.data[1],從而讓2号元素也留下了。由于1号元素與2号元素是不相等的,兩個元素都留下了。在這個for循環中j要遍曆到末尾,語句結束的條件是j等于線性表的長度,才跳出for循環語句。
當再執行for語句,此時j ,j由原來的位置1變成了位置2,i還是原來的位置1。這時比較兩個位置上的數,發現2與2是相等的,這樣沒有進入if語句中,就無法賦值,無法進行數據的保存。i還是保持在1位置,j 就變成了3位置,相當于把第二位置的2删掉了。
當再次for循環體中,執行if語句發現1号位置的2與3号位置的3的值不重複,進入循環體中,i先自加1,變成2位置,這樣就把j的3号位置的數字3賦值給2号位置,此時2号位置存入了元素3數字。
這樣依次遍曆下去,i<=j,始終将後面的元素賦值給前面,從而避免了重複值。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!