给一个非严格递增排列的数组,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。
非严格递增排列,说明了如果元素有重复出现,那么就一定在一块出现,原地删除就是直接在给定数组中进行操作,最后要返回删除后数组的长度。
我们使用函数DuplicateDataRemove操作。
int DuplicateDataRemove(int* arr, size_t arrsize);
传入了需要去重的数组arr首地址,以及arr的长度。
我们使用两个指针/下标,一个dest用于遍历整个数组元素,另一个src用于替换重复出现的元素。
由于去重,我们赋值dest为1,src为0。
int src = 0;
int dest = 1;
那么当我们dest指向的元素与src不同时,我们将src后一位空间中的数据替换为dest指向的元素,替换后将dest增1,这样就把有效元素前移了;当dest指向的元素与src相同的时候,那么就直接dest向后继续遍历,直到dest走到数组的末尾停止,即while循环条件dest<arrsize。
while (dest < arrsize)
{
if (arr[src] != arr[dest])
{
src++;
arr[src] = arr[dest];
dest++;
//arr[++src] = arr[dest++];
}
else
dest++;
}
循环结束后,我们将所有的有效元素,也就是没有重复的元素放在了数组arr的前面位置处,此时arr[src]表示这个数组的最后一个有效元素,那么去重后的长度就是src+1。如果使用指针,注意长度的计算使用src+1减去首地址arr即可。下标由于是整型,直接返回就行。
return src+1;//下标形式
图解如下: